斗地主之顺子
【编程 | 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;
} 