题目描述:给定一组扑克牌,判断其中是否存在五张扑克牌组成同花顺的牌型。
每张扑克牌由花色和点值组成。花色包括:黑桃(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;
}
![](https://i-blog.csdnimg.cn/blog_migrate/2a26f3184fb72e48ff385d9d5d4083c3.png)