亚马逊 在线笔试 2014-10-9 比较扑克牌序列
2016-05-14 16:25
274 查看
第一题:巨麻烦的一道题目,大意是比较扑克牌序列,每个序列四张牌
规则一:四张牌相同。自然数字大的胜出,比如3,3,3,3 < 6,6,6,6
规则二:四张牌连续。当然序列最大的那个胜出。但是有个小trick,A在这里默认表最大牌,但是如果后接2,3,4,则A表最小牌,为了获得连续序列
比如A,2,3,4 < J,Q,K,A
规则三:有三张相同。以每个序列相同牌较大的胜出。
比如3,3,3,2>2,2,2,A
规则四: 两个对子。当然以对子较大的胜出,最大的对子相同,则以次大的对子较大者胜出。
比如4,4,3,3 > 4,2,4,2
规则五:一个对子。对子较大者胜出,如果对子相同,则比较剩下较大牌,如果还相同,比较次大牌
3,3,7,4 < 3,3,7,5
规则六:如果以上皆不满足,则按照大牌>小牌比较(即从最大牌开始比较,分出高下为止)
如果两个序列不属于同一规则,则规则小者胜出。
如果序列一大于序列二,输出1,反之输出-1;如果序列相同,输出0。
如果发现作弊,即两副牌中某张牌数量超过5张,则输出-2。
OK,以上是题目描述。这个题目,个人感觉主要是读懂题意,实现起来确实也非常麻烦,但是没啥难点,但是也会搞很久。
主要是几点:
1、解析输入字符串(如果你用C、C++,会比较蛋疼)
2、适配规则逻辑(更像状态机)
3,比较逻辑
好像也没啥是吧,但是本屌丝做了N久才把Case全过。而且代码巨长,200+行,准备吃饭去了,代码稍后奉上。
昨晚有事。现在奉上我水的不忍直视的代码。
规则一:四张牌相同。自然数字大的胜出,比如3,3,3,3 < 6,6,6,6
规则二:四张牌连续。当然序列最大的那个胜出。但是有个小trick,A在这里默认表最大牌,但是如果后接2,3,4,则A表最小牌,为了获得连续序列
比如A,2,3,4 < J,Q,K,A
规则三:有三张相同。以每个序列相同牌较大的胜出。
比如3,3,3,2>2,2,2,A
规则四: 两个对子。当然以对子较大的胜出,最大的对子相同,则以次大的对子较大者胜出。
比如4,4,3,3 > 4,2,4,2
规则五:一个对子。对子较大者胜出,如果对子相同,则比较剩下较大牌,如果还相同,比较次大牌
3,3,7,4 < 3,3,7,5
规则六:如果以上皆不满足,则按照大牌>小牌比较(即从最大牌开始比较,分出高下为止)
如果两个序列不属于同一规则,则规则小者胜出。
如果序列一大于序列二,输出1,反之输出-1;如果序列相同,输出0。
如果发现作弊,即两副牌中某张牌数量超过5张,则输出-2。
OK,以上是题目描述。这个题目,个人感觉主要是读懂题意,实现起来确实也非常麻烦,但是没啥难点,但是也会搞很久。
主要是几点:
1、解析输入字符串(如果你用C、C++,会比较蛋疼)
2、适配规则逻辑(更像状态机)
3,比较逻辑
好像也没啥是吧,但是本屌丝做了N久才把Case全过。而且代码巨长,200+行,准备吃饭去了,代码稍后奉上。
昨晚有事。现在奉上我水的不忍直视的代码。
#include <iostream> #include <sstream> #include <string> #include <cstring> #include <algorithm> using namespace std; int change(char a) { switch (a) { case 'A': return 14; break; case 'J': return 11; break; case 'Q': return 12; break; case 'K': return 13; break; default: return 0; break; } } int istype(int *a) { int x = a[0]; int ans = 1; int hash[15]; memset(hash, 0, sizeof(hash)); for (int i = 0; i < 4; i++) { hash[a[i]]++; } int eq = 1; int deq = 0; for (int i = 1; i < 15; i++) { if (hash[i] == 4) return 1; if (hash[i] == 3) return 3; if (i>1) { if (hash[i] == hash[i - 1]&&hash[i]==1) { eq++; } } if (eq == 4) return 2; if (hash[i] == 2) deq++; if (deq == 2) return 4; } if (deq == 1) return 5; if (eq == 3 && hash[2] == hash[3] && hash[3] == hash[4] &&hash[2]==1 ){ if (a[3] == 14){ a[3] = 1; sort(a, a + 4); return 2; } } return 6; } int cmp(int *a, int *b, int kind) { if (kind == 3) { int h1[15], h2[15]; memset(h1, 0, sizeof(h1)); memset(h2, 0, sizeof(h2)); int c1, c2; for (int i = 0; i<4; i++) { h1[a[i]]++; if (h1[a[i]] == 3) c1 = a[i]; } for (int i = 0; i<4; i++) { h2[b[i]]++; if (h2[a[i]] == 3) c2 = a[i]; } if (c1>c2) return 1; if (c1<c2) return -1; } if (kind == 4) { int h1[15], h2[15]; memset(h1, 0, sizeof(h1)); memset(h2, 0, sizeof(h2)); int c1, c2; for (int i = 0; i<4; i++) { h1[a[i]]++; if (h1[a[i]] == 2) c1 = a[i]; } for (int i = 0; i<4; i++) { h2[b[i]]++; if (h2[a[i]] == 2) c2 = a[i]; } if (c1>c2) return 1; if (c1<c2) return -1; } for (int i = 3; i >=0; i--) { if (a[i] > b[i]) return 1; else if (a[i] < b[i]) return -1; } return 0; } int main() { /* Enter your code here. Read input from STDIN. Print output to STDOUT */ string a, b; int aa[4], bb[4]; int hash[15]; while (cin >> a >> b) { int ans = 0; int idx = 0; for (int i = 0; i < a.size(); i++) { int sum = 0; if (a[i] >= '2'&&a[i] <= '9') { sum = a[i] - '0'; aa[idx++] = sum; } else if (a[i] == '1') { sum = 10; aa[idx++] = sum; i++; } else if (a[i] == ',') { continue; } else{ sum = change(a[i]); aa[idx++] = sum; } } idx = 0; for (int i = 0; i < b.size(); i++) { int sum = 0; if (b[i] >= '2'&&b[i] <= '9') { sum = b[i] - '0'; bb[idx++] = sum; } else if (b[i] == '1') { sum = 10; bb[idx++] = sum; i++; } else if (b[i] == ',') { continue; } else{ sum = change(b[i]); bb[idx++] = sum; } } memset(hash, 0, sizeof(hash)); for (int i = 0; i < 4; i++) { hash[aa[i]]++; hash[bb[i]]++; if (hash[aa[i]] > 4 || hash[bb[i]] > 4) { ans = -2; break; } } if (ans == -2) { cout << ans << endl; continue; } std::sort(aa, aa + 4); std::sort(bb, bb + 4); int ka = istype(aa); int kb = istype(bb); //for (int i = 0; i < 4; i++) // cout << aa[i] << " "; //cout << endl; //for (int i = 0; i < 4; i++) // cout << bb[i] << " "; //cout << endl; //cout << ka << " " << kb << endl; if (ka == kb) { ans = cmp(aa, bb,ka); } else{ if (ka < kb) ans = 1; else ans = -1; } cout << ans << endl; } return 0; }
相关文章推荐
- 栈
- thinkphp3.2,URL重写
- activiti 自定义用户、组
- ios开发学习笔记--Core Motion
- GDOI2016 Day1 T2 最长公共子串
- 网络请求——XML解析
- 常见排序算法(二)
- Java并发编程:阻塞队列
- Open-E DSS V7 应用系列之二 系统安装
- Open-E DSS V7 应用系列之二 系统安装
- PHP 升级到5.5后MySQL的代替法
- ROS_DHCP添加路由
- App Links
- Activity和Fragment的生命周期
- Condition线程通信
- 关于scrollview 镶嵌linearlayout布局的控件位于底部的问题 关于scrollview镶嵌RelativeLayout布局失效
- Synchronized关键字
- B
- 2016-5-14总结
- centos下hadoop2.6.0集群搭建详细过程