模拟即可
变量解释
string t;//输入时用
int a[105];//输入时用
int tot;//输入时用
queue<int> v[4];//v[0]表示溪染的牌 v[1]表示叁秋的牌
string cname[3]={"xiran","sanqiu"};//输出时用
string pai[24]={"","A","2","3","4","5","6","7","8","9","10","J","Q","K"};//输出时用
stack<int> q;//桌面上的牌
bool flag[21];//判断编号为i的牌是否出现在桌面上
参考代码
#include<bits/stdc++.h>
using namespace std;
string t;
int a[105];
int tot;
queue<int> v[4];
string cname[3]={"xiran","sanqiu"};
string pai[24]={"","A","2","3","4","5","6","7","8","9","10","J","Q","K"};
stack<int> q;
bool flag[21];
void get(int k,int x)//从桌面上获得牌
{
int all=2;
while(q.size()&&all){
v[x].push(q.top());
flag[q.top()]=0;//取消标记
if(q.top()==k)
all--;
q.pop();
}
}
void work(int x)
{
int k=v[x].front();
v[x].pop();
q.push(k);
if(k==11){
if(q.size()==1)
return; //触发空钩
else{
get(0,x);//拿走桌面上全部的牌
work(x);//再出一张牌
}
}
else{
if(flag[k]){//如果这种牌在桌面上出现过
get(k,x);//拿走牌
work(x);//再出一张牌
}
else
flag[k]=1;//标记
}
}
int main()
{
cin>>t;
for(int i=0;i<=t.size();i++){
if(t[i]=='A') a[++tot]=1;
else if(t[i]>='2'&&t[i]<='9') a[++tot]=t[i]-'0';
else if(t[i]=='1') {a[++tot]=10;i++;}
else if(t[i]=='J') a[++tot]=11;
else if(t[i]=='Q') a[++tot]=12;
else if(t[i]=='K') a[++tot]=13;
}//输入处理
for(int i=1;i<=tot;i++) v[i&1].push(a[i]);//轮流取牌
int win=0;//胜利者
while(1){
work(1);
if(v[1].size()==0) {win=0;break;}//判断游戏是否结束
work(0);
if(v[0].size()==0) {win=1;break;}//判断游戏是否结束
}
//输出
cout<<cname[win]<<"\n";
while(v[win].size()){
cout<<pai[v[win].front()]<<" ";
v[win].pop();
}
return 0;
}