金钩钓鱼

模拟即可

变量解释

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;
}
全部评论

相关推荐

02-05 08:49
已编辑
武汉大学 Java
野猪不是猪🐗:36k和36k之间亦有差距,ms的36k和pdd的36k不是一个概念
点赞 评论 收藏
分享
希望被捞的猫头鹰很理智:大概率待遇低怕硕士跑路
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务