模拟即可 变量解释 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;}