斗地主之顺子
【编程 | 200分】 斗地主之顺子
题目描述:
-
在斗地主扑克牌游戏中, 扑克牌由小到大的顺序为:3,4,5,6,7,8,9,10,J,Q,K,A,2,
-
玩家可以出的扑克牌阵型有:单张、对子、顺子、飞机、炸弹等。
-
其中顺子的出牌规则为:由 至少 5 张由小到大连续递增 的扑克牌组成,且 不能包含 2 。
-
例如:{3,4,5,6,7}、{3,4,5,6,7,8,9,10,J,Q,K,A}都是有效的顺子;
-
而{J,Q,K,A,2}、 {2,3,4,5,6}、{3,4,5,6}、{3,4,5,6,8}等都不是顺子。
-
给定一个包含13张牌的数组,如果有满足出牌规则的顺子,请输出顺子。
-
如果存在多个顺子,请每行输出一个顺子,且需要按顺子的 第一张牌的大小(必须从小到大) 依次输出。
-
如果没有满足出牌规则的顺子,请 输出 No 。
输入描述:
13张任意顺序的扑克牌,每张扑克牌数字用空格隔开,每张扑克牌的数字都是合法的,并且不包括大小王:
不需要考虑输入为异常字符的情况
输出描述:
组成的顺子,每张扑克牌数字用空格隔开:
示例1:
输入
输出
说明
13张牌中,可以组成的顺子只有1组:3 4 5 6 7
示例2:
输入
输出
说明
13张牌中,可以组成2组顺子,从小到大分别为:3 4 5 6 7 和 9 10 J Q K A
示例3:
输入
输出
说明
13张牌中,无法组成顺子
注意:
特殊输入
对应输出
运行结果
测试结果
通过率:100%
参考代码
#include<bits/stdc++.h> using namespace std; typedef std::uint64_t hash_t; constexpr hash_t prime = 0x100000001B3ull; constexpr hash_t basis = 0xCBF29CE484222325ull; class Poker { public: int currLastValue{}; vector<int> allData; ~Poker() = default; }; void SplitString(string input, vector <string> &output, string pattern) { string::size_type pos; input += pattern; for (int i = 0; i < input.size(); i++) { pos = input.find(pattern, i); if (pos < input.size()) { string temp = input.substr(i, pos - i); if ((temp != pattern) && (!temp.empty())) { output.push_back(temp); } i = pos + pattern.size() - 1; } } } int getIntegerValue(char poker) { switch (poker) { case 'J': return 11; case 'Q': return 12; case 'K': return 13; case 'A': return 14; default: return poker - '0'; } } string getStringValue(int poker) { switch (poker) { case 11: return "J"; case 12: return "Q"; case 13: return "K"; case 14: return "A"; default: return to_string(poker); } } int main(int argc, char **argv) { string str; getline(cin, str); vector <string> out; SplitString(str, out, " "); vector<int> ACE; for (int i = 0; i < out.size(); i++) { if (out[i] == "10") { ACE.push_back(stoi(out[i])); } else if (out[i] != "2" && out[i] != "10") { ACE.push_back(getIntegerValue(out[i][0])); } } sort(ACE.begin(), ACE.end()); queue<int> Q; for (int x: ACE) Q.push(x); vector <Poker*> allSortedList; int lastValue = 0; while (!Q.empty()) { int currentValue = Q.front(); Q.pop(); if (lastValue == 0) { Poker *poker = new Poker; poker->currLastValue = currentValue; vector<int> tempData; tempData.push_back(currentValue); poker->allData = tempData; allSortedList.push_back(poker); } else { if (currentValue - lastValue == 0) { bool isAdded = false; for (auto &poker: allSortedList) { if (currentValue - poker->currLastValue == 1) { poker->currLastValue = currentValue; poker->allData.push_back(currentValue); isAdded = true; break; } } if (!isAdded) { Poker *poker = new Poker; poker->currLastValue = currentValue; vector<int> allData; allData.push_back(currentValue); poker->allData = allData; allSortedList.push_back(poker); } } else if (currentValue - lastValue == 1) { for (Poker *poker: allSortedList) { if (poker->currLastValue == lastValue) { poker->currLastValue = currentValue; poker->allData.push_back(currentValue); break; } } } else { Poker *poker = new Poker; poker->currLastValue = currentValue; vector<int> allData; allData.push_back(currentValue); poker->allData = allData; allSortedList.push_back(poker); } } lastValue = currentValue; } sort(allSortedList.begin(), allSortedList.end(), [](Poker* Poker1, Poker* Poker2){ return Poker1->allData.size() < Poker2->allData.size(); }); int counter = 0; for (Poker *poker: allSortedList) { if (poker->allData.size() >= 5) { for (int i = 0; i < poker->allData.size(); i++) { cout << getStringValue(poker->allData[i]); if (i != poker->allData.size() - 1) cout << " "; } cout << endl; counter++; } } if(counter == 0) cout << "NO" << endl; return 0; }