题目描述
在斗地主扑克牌游戏中,扑克牌由小到大的顺序为: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}都是有效的顺子,而{Q,K,A,2}、(2,3,4,5,6}、(3,4,5,6}、(3,4,5,6,8)等都不是顺子。
给定一个包含 13 张牌的数组,如果有满足出牌规则的顺子请输出顺子。 如果存在多个顺子,请每行输出一个顺子,且需要按顺子的第一张牌的大小(必须从小到大)依次输出。 如果没有满足出牌规则的顺子,请输出NO。
输入描述: 13张任意顺序的扑克牌,每张扑克牌数字用空格隔开,每张扑克牌的数字都是合法的,并且不包括大小王,不需要考虑输入为异常字符的情况
输出描述: 组成的顺子,每张扑克牌数字用空格隔开。
示例1
输入
2 9 J 2 3 4 K A 7 9 A 5 6
输出 3 4 5 6 7
说明 13张牌中,可以组成的顺子只有1组
示例2
输入 2 9 J 10 3 4 K A 7 Q A 5 6
输出 3 4 5 6 7
9 10 J Q K A
说明 13张牌中,可以组成2组顺子
示例3
输入 2 9 9 9 3 4 K A 10 Q A 5 6
输出 NO
说明 13张牌中,无法组成顺子。
#include<iostream>
#include<sstream>
#include<string>
#include<vector>
#include<algorithm>
using namespace std;
int getval(string card)
{
if (card.length() == 1 && (card[0] >= '3' && card[0] <= '9')) return card[0] - '0';
if (card == "10") return 10;
if (card == "J") return 11;
if (card == "Q") return 12;
if (card == "K") return 13;
if (card == "A") return 14;
return 0; // 处理非法输入
}
string tostring(int val)
{
if (val >= 3 && val <= 9) return to_string(val);
if (val == 10) return "10";
if (val == 11) return "J";
if (val == 12) return "Q";
if (val == 13) return "K";
if (val == 14) return "A";
return "";
}
void find(vector<int> &v,vector<vector<int>> &ans)
{
vector<bool> used(v.size(),false);
for(int i=0;i<v.size();i++)
{
if(used[i]==true) continue;
vector<int> now;
now.push_back(v[i]);
used[i]=true;
for(int j=i+1;j<v.size();j++)
{
if(used[j]) continue;
if(v[j]==now.back()+1) //当前元素为now中元素+1,则加入
{
used[j]=true;
now.push_back(v[j]);
}
else{ //当前元素为不满足,则break
break;
}
}
if(now.size()>=5)
{
ans.push_back(now);
}
else{
for(int k:now)
used[k]=false;
}
}
}
/*关键点是J、Q、K、A不能直接转为数字*/
int main()
{
/*用空格分割的输入,且题目说了每次就13张牌*/
vector<string> v(13);
for(int i=0;i<13;i++)
{
cin>>v[i];
}
vector<int> v1;
for(int i=0;i<13;i++)
{
int n=getval(v[i]);
if(n!=0) //排除'2'
{
v1.push_back(n);
}
}
sort(v1.begin(),v1.end());
vector<vector<int>> ans;
find(v1,ans); //找寻符合的顺子
if(ans.empty())
{
cout<<"NO"<<endl;
}
else{
for(auto i:ans){
for(int j=0;j<i.size();j++)
{
cout<<tostring(i[j])<<" ";
}
cout<<endl;
}
}
return 0;
}