赞
踩
题目描述:给定一组扑克牌,判断其中是否存在五张扑克牌组成同花顺的牌型。
每张扑克牌由花色和点值组成。花色包括:黑桃(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;
- }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。