题目描述:给定一组扑克牌,判断其中是否存在五张扑克牌组成同花顺的牌型。
每张扑克牌由花色和点值组成。花色包括:黑桃(S)、红桃(H)、梅花(C)、方片(D);点值从小到大包括:2、3、4、5、6、7、8、9、10、J、Q、K、A。
组成同花顺的五张牌需要满足两个条件:
1、花色都相同:
2、连成顺子,或者点值为A、2、3、4、5;
输入描述:每张扑克牌通过花色和点值拼接成的一个字符串表示,例如红桃10为H10,方片A表示成DA。
第一行输入一个正整数,表示输入用例数。
第二行开始,每行输入一个用例,每个用例先输入一个正整数m,表示总的扑克牌数。紧接着输入m个扑克牌。
每个用例里的扑克牌都从一副牌中抽取。
输出描述:对应每个输入用例输出一行结果,包含一个字符。Y表示存在五张牌组成同花顺,N表示不存在。
题目给出的输入示例貌似并不符合题目要求,第3、4行的输入都出现了相同的牌HK,不知道是不是因为出题的失误。按照本文的做法,如果一行中出现相同的牌,程序将会产生异常。
下面是我的C++代码。
我的方法是:
1、首先对牌按照花色分组,每个分组按照2、3、4、5、6、7、8、9、10、J、Q、K、A的顺序排序。
2、从第二张开始遍历经过分组和排序的牌堆。用一个整型count来计数。count初值设置为1。如果遍历到的牌跟前一张牌花色相同且牌面值为前一张牌+1,则count++。否则count=1。
因为要考虑A、2、3、4、5这种情况,所以当count=4时,如果此时读取到的牌为4,往后找跟它相同花色的A。如果能找到,说明可以组成A、2、3、4、5,返回。
为了方便起见,就不按照在线编程的要求进行多次重复输入验证了,只测试一组输入。
#include <iostream> #include <vector> #include <string> #include <algorithm> using namespace std; string list[13] = { "2","3","4","5","6","7","8","9","10","J","Q","K","A" }; int getIndex(string str) { string tmp = str.substr(1, str.size() - 1); for (int i = 0; i < 13; i++) { if (list[i] == tmp) return i; } } bool compare(string s1, string s2) { if (s1[0] != s2[0]) return s1[0] < s2[0]; string tmp1 = s1.substr(1,s1.size()-1), tmp2 = s2.substr(1, s2.size() - 1); int index1, index2; for (int i = 0; i < 13; i++) { if (list[i] == tmp1) index1=i; if (list[i] == tmp2) index2=i; } return index1 < index2; } bool isFlush(vector<string> &vec) { sort(vec.begin(), vec.end(), compare); int size = vec.size(); int count; for (int i = 0; i < size; i++) { if (i == 0) count = 1; else { int index1 = getIndex(vec[i - 1]); int index2 = getIndex(vec[i]); if (vec[i][0] == vec[i - 1][0] && index2 - index1 == 1) count++; else count = 1; if (count == 5) return true; //当count到达4时,如果vec[i]为5,则在vec中找是否有同花色的A //如果找到,直接返回true if (count == 4 && vec[i][1] == '5') { for (int j = i + 1; j < vec.size(); j++) { if (vec[j][0] == vec[i][0] && vec[j][1] == 'A') return true; if (vec[j][0] != vec[i][0]) break; } } } } return false; } int main() { int m, n; cin >> m; vector<char> res(m); for (int i = 0; i < m; i++) { cin >> n; vector<string> vec(n); for (int j = 0; j < n; j++) { cin >> vec[j]; } if (isFlush(vec)) res[i]='Y'; else res[i] = 'N'; } for (int i = 0; i < m; i++) { cout << res[i] << endl; } system("pause"); return 0; }