斗地主之顺子
题目描述
- 在斗地主扑克牌游戏中, 扑克牌由小到大的顺序为: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张任意顺序的扑克牌,每张扑克牌数字用空格隔开,每张扑克牌的数字都是合法的,并且不包括大小王:
2 9 J 2 3 4 K A 7 9 A 5 6
不需要考虑输入为异常字符的情况
输出描述
组成的顺子,每张扑克牌数字用空格隔开:
3 4 5 6 7
示例1
#include <iostream>
#include<string>
#include<algorithm>
#include<vector>
using namespace std;
int char_to_int(string s)
{
if(s == "j")
{
return 11;
}
else if(s == "q")
{
return 12;
}
else if(s == "k")
{
return 13;
}
else if(s == "a")
{
return 14;
}
else if(s == "10")
{
return 10;
}
else {
return stoi(s);
}
}
string int_to_char(int a)
{
if (a == 11) {
return "j";
} else if (a == 12) {
return "q";
} else if (a == 13) {
return "k";
} else if (a == 14) {
return "a";
}
else if(a == 10)
{
return "10";
}
else {
return to_string(a);
}
}
void int_to_str(string& s, vector<int>& vt) {
s = "";
for (int i = 0; i < vt.size(); ++i) {
s += int_to_char(vt[i]);
}
}
int main() {
string input;
while (getline(cin, input)) { //输入字符串
if (input.empty()) {
return 0;
}
int index = 0;
vector<int> vt;//用int转换对应牌,方便排序和动规
while ((index = input.find(' ')) && index != string::npos) {//切割原字符串并记录对应牌Int值
string tmp = input.substr(0,index);//input后面会重新组合,这里直接切
vt.push_back(char_to_int(tmp));
input = input.substr(index + 1);
}
if(!input.empty())//记录最后一张牌的值
{
vt.push_back(char_to_int(input));
}
sort(vt.begin(), vt.end());
int_to_str(input, vt);//更新记录Input
cout << input << endl;
int sz = vt.size();
vector<vector<int>> dp(sz, vector<int>(sz, 0));
vector<string> ans;
//动规获取符合条件的顺子,dp[i][j]表示input中 i-j顺子牌的个数。
for (int i = 0; i < sz; ++i) {
if (vt[i] == 2) {
continue;//2不参与顺子
}
for (int j = i; j < sz; ++j) {
//cout<<"i , j : "<<i<<","<< j<<endl;
//cout<<"vt[i],vt[j] : "<<vt[i]<<","<<vt[j]<<endl;
if (i == j) {
dp[i][j] = 1;
}
else if (vt[j] - vt[j - 1] == 1) {
dp[i][j] = dp[i][j - 1] + 1;
} else {
continue;
}
cout << "dp[i][j] : " << dp[i][j] << endl;
if (dp[i][j] > 4) {//符合顺子条件
//string tmp = input.substr(i, dp[i][j]);
string tmp = "";
for(int k = i;k < j;++k)
{
tmp += int_to_char(vt[k]);
tmp += " ";
}
tmp += int_to_char(vt[j]);
cout<<"tmp : "<<tmp<<endl;;
ans.push_back(tmp);
}
}
}
if(ans.empty())
{
cout<<"NO"<<endl;
}
for(int i = 0;i < ans.size();++i)
{
cout<<ans[i]<<endl;
}
}
return 0;
}```