[编程题] 扎金花
两个搜狐的程序员加了一个月班,终于放假了,于是他们决定扎金花渡过愉快的假期 。 游戏规则: 共52张普通牌,牌面为2,3,4,5,6,7,8,9,10,J,Q,K,A之一,大小递增,各四张; 每人抓三张牌。两人比较手中三张牌大小,大的人获胜。 对于牌型的规则如下: 1.三张牌一样即为豹子 2.三张牌相连为顺子(A23不算顺子) 3.有且仅有两张牌一样为对子 豹子>顺子>对子>普通牌型 在牌型一样时,比较牌型数值大小(如AAA>KKK,QAK>534,QQ2>10104) 在二人均无特殊牌型时,依次比较三张牌中最大的。大的人获胜,如果最大的牌一样,则比较第二大,以此类推(如37K>89Q) 如二人牌面相同,则为平局。
输入描述:
输入两个字符串代表两个玩家的牌(如"10KQ" "354"),先输入的作为玩家1,后输入的作为玩家2
输出描述:
1 代表 玩家1赢 0 代表 平局 -1 代表 玩家2赢 -2 代表不合法的输入
输入例子:
KQ3 3Q9 10QA 6102 5810 7KK 632 74J 10102 K77 JKJ 926 68K 27A
输出例子:
1 1 -1 -1 1 1 -1
#include<iostream> #include<vector> #include<string> #include<algorithm> using namespace std; int str2dig(string s) { int n = s.size(); if (n == 2) { if (s[0] == '1' && s[1] == '0') return 10; else return -1; } else if (n == 1) { switch (s[0]) { case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': return s[0] - '2' + 2; case 'J': return 11; case 'Q': return 12; case 'K': return 13; case 'A': return 14; default: return -1; } } else return -1; } void f(string s, vector<int>& v) { int n = s.size(); if (n == 0) return; int val; if (s[n - 1] == '0' && n >= 2) { val = str2dig(s.substr(n - 2, 2)); v.push_back(val); if (val == -1) return; else f(s.substr(0, n - 2), v); } else { val = str2dig(s.substr(n - 1, 1)); v.push_back(val); if (val == -1) return; else f(s.substr(0, n - 1), v); } } void f1(vector<int>&v) { if (v[v.size() - 1] == -1) return; if (v.size() != 3) { v.push_back(-1); return; } sort(v.begin(), v.end()); if (v[0] == v[2]) { v.push_back(4); return; } else if (v[0] + 1 == v[1] && v[1] + 1 == v[2]) { v.push_back(3); return; } else if (v[0] == v[1] || v[1] == v[2]) { if (v[0] == v[1]) swap(v[0], v[2]); v.push_back(2); return; } else { v.push_back(1); return; } } int cmp(vector<int>& lhs, vector<int>& rhs) { int n = lhs.size(); if (n == 0) return 1; else { if (lhs[n - 1] > rhs[n - 1]) return 1; else if (lhs[n - 1] < rhs[n - 1]) return -1; else { lhs.pop_back(); rhs.pop_back(); return cmp(lhs, rhs); } } } int main() { string s1, s2; while (cin >> s1 >> s2) { vector<int> v1; vector<int> v2; f(s1, v1); f(s2, v2); f1(v1); f1(v2); if (v1[v1.size() - 1] == -1 || v2[v2.size() - 1] == -1) { cout << "-2" << endl; } else { int c = cmp(v1, v2); if (c == 1) cout << "1" << endl; else if (c == -1) cout << "-1" << endl; else cout << "0" << endl; } } return 0; }