c++ class嵌套(中兴捧月-比特-复赛题 1)

2021中兴捧月-比特-复赛题 1

#include<bits/stdc++.h>
using namespace std;
struct card{
    int color,num;
};
struct people{
    int cnt=0;
    card ca[4];
};
char s[1000];
int colorMap[100];
int numMap[100];

void Init(){
    //花色
    colorMap['S']=4;
    colorMap['H']=3;
    colorMap['C']=2;
    colorMap['D']=1;
    for(int i='2';i<='9';i++)numMap[i]=i-'0';
    numMap['1']=10;//注意读到1时说明读到的为数字10
    numMap['J']=11;
    numMap['Q']=12;
    numMap['K']=13;
    numMap['A']=14;
}

int JudgeOne(people A,people B){
    //单牌比大小
    if(A.ca[1].num>B.ca[1].num)return 0;
    if(A.ca[1].num<B.ca[1].num)return 1;
    if(A.ca[1].color>B.ca[1].color)return 0;
    if(A.ca[1].color<B.ca[1].color)return 1;
    return 2;
}

bool cmp(card X,card Y){
    //对牌进行大小排序,数字大的在前面,数字一样时按花色
    if(X.num>Y.num)return 1;
    if(X.num<Y.num)return 0;
    if(X.color>Y.color)return 1;
    return 0;
}

int JudgeTwo(people A,people B){
    sort(A.ca+1,A.ca+3,cmp);
    sort(B.ca+1,B.ca+3,cmp);
    int A_Is_Dui,B_Is_Dui;
    if(A.ca[1].num==A.ca[2].num)A_Is_Dui=1;//判断A是否为对子
    else A_Is_Dui=0;
    if(B.ca[1].num==B.ca[2].num)B_Is_Dui=1;//判断B是否为对子
    else B_Is_Dui=0;
    if(A_Is_Dui==1&&B_Is_Dui==0)return 0;
    if(A_Is_Dui==0&&B_Is_Dui==1)return 1;
    if(A_Is_Dui==1&&B_Is_Dui==1){
        if(A.ca[1].num>B.ca[1].num)return 0;
        if(A.ca[1].num<B.ca[1].num)return 1;
        if(A.ca[1].color>B.ca[1].color)return 0;
        if(A.ca[1].color<B.ca[1].color)return 1;
        if(A.ca[2].color>B.ca[2].color)return 0;
        if(A.ca[2].color<B.ca[2].color)return 1;
        return 2;
    }
    if(A_Is_Dui==0&&B_Is_Dui==0){
        if(A.ca[1].num>B.ca[1].num)return 0;
        if(A.ca[1].num<B.ca[1].num)return 1;
        if(A.ca[1].color>B.ca[1].color)return 0;
        if(A.ca[1].color<B.ca[1].color)return 1;
        return 2;
    }
    return 2;
}
int JudgeThree(people A,people B){
    sort(A.ca+1,A.ca+4,cmp);
    sort(B.ca+1,B.ca+4,cmp);
    int A_Is_Bomb,B_Is_Bomb;
    //判断炸弹的情况
    if(A.ca[1].num==A.ca[2].num&&A.ca[1].num==A.ca[3].num)A_Is_Bomb=1;
    else A_Is_Bomb=0;
    if(B.ca[1].num==B.ca[2].num&&B.ca[1].num==B.ca[3].num)B_Is_Bomb=1;
    else B_Is_Bomb=0;
    
    int A_Is_Flush,B_Is_Flush;
    //判断同花的情况
    if(A.ca[1].color==A.ca[2].color&&A.ca[1].color==A.ca[3].color)A_Is_Flush=1;
    else A_Is_Flush=0;
    if(B.ca[1].color==B.ca[2].color&&B.ca[1].color==B.ca[3].color)B_Is_Flush=1;
    else B_Is_Flush=0;
    
    int A_Is_Straight,B_Is_Straight;
    //判断顺子的情况
    if(A.ca[1].num==A.ca[2].num+1&&A.ca[2].num==A.ca[3].num+1)A_Is_Straight=1;
    else if(A.ca[1].num==14&&A.ca[2].num==3&&A.ca[3].num==2)A_Is_Straight=1;
    else A_Is_Straight=0;
    if(B.ca[1].num==B.ca[2].num+1&&B.ca[2].num==B.ca[3].num+1)B_Is_Straight=1;
    else if(B.ca[1].num==14&&B.ca[2].num==3&&B.ca[3].num==2)B_Is_Straight=1;
    else B_Is_Straight=0;
    
    int A_Is_Straight_Flush,B_Is_Straight_Flush;
    //判断同花顺的情况
    if(A_Is_Flush&&A_Is_Straight)A_Is_Straight_Flush=1;
    else A_Is_Straight_Flush=0;
    if(B_Is_Flush&&B_Is_Straight)B_Is_Straight_Flush=1;
    else B_Is_Straight_Flush=0;
    
    int A_Is_Pair,B_Is_Pair;
    //判断对子的情况
    if(A.ca[1].num==A.ca[2].num||A.ca[2].num==A.ca[3].num)A_Is_Pair=1;
    else A_Is_Pair=0;
    if(B.ca[1].num==B.ca[2].num||B.ca[2].num==B.ca[3].num)B_Is_Pair=1;
    else B_Is_Pair=0;
    
    int A_Is_Bomb_Killer=0,B_Is_Bomb_Killer=0;
    //判断炸弹杀手的情况
    if(A.ca[1].num==5&&A.ca[2].num==3&&A.ca[3].num==2){
        if(A.ca[1].color!=A.ca[2].color&&A.ca[1].color!=A.ca[3].color&&A.ca[2].color!=A.ca[3].color)A_Is_Bomb_Killer=1;
    }
    if(B.ca[1].num==5&&B.ca[2].num==3&&B.ca[3].num==2){
        if(B.ca[1].color!=B.ca[2].color&&B.ca[1].color!=B.ca[3].color&&B.ca[2].color!=B.ca[3].color)B_Is_Bomb_Killer=1;
    }
    
    //A与B中存在炸弹
    if(A_Is_Bomb||B_Is_Bomb){
        if(A_Is_Bomb){
            if(B_Is_Bomb_Killer)return 1;
            if(B_Is_Bomb==0)return 0;
            if(A.ca[1].num>B.ca[1].num)return 0;
            if(A.ca[1].num<B.ca[1].num)return 1;
            if(A.ca[1].color>B.ca[1].color)return 0;
            if(A.ca[1].color>B.ca[1].color)return 1;
            if(A.ca[2].color>B.ca[2].color)return 0;
            if(A.ca[2].color<B.ca[2].color)return 1;
            if(A.ca[3].color>B.ca[3].color)return 0;
            if(A.ca[3].color<B.ca[3].color)return 1;
            return 2;
        }else{
            if(A_Is_Bomb_Killer)return 0;
            return 1;
        }
    }
    
    //A与B中存在同花顺
    if(A_Is_Straight_Flush||B_Is_Straight_Flush){
        if(A_Is_Straight_Flush==1){
            if(B_Is_Straight_Flush==0)return 0;
            if(A.ca[1].num>B.ca[1].num)return 0;
            if(A.ca[1].num<B.ca[1].num)return 1;
            if(A.ca[1].color>B.ca[1].color)return 0;
            if(A.ca[1].color<B.ca[1].color)return 1;
            return 2;
        }else{
            return 1;
        }
    }
    
    //A与B中存在同花
    if(A_Is_Flush||B_Is_Flush){
        if(A_Is_Flush==1){
            if(B_Is_Flush==0)return 0;
            if(A.ca[1].num>B.ca[1].num)return 0;
            if(A.ca[1].num<B.ca[1].num)return 1;
            if(A.ca[2].num>B.ca[2].num)return 0;
            if(A.ca[2].num<B.ca[2].num)return 1;
            if(A.ca[3].num>B.ca[3].num)return 0;
            if(A.ca[3].num<B.ca[3].num)return 1;
            if(A.ca[1].color>B.ca[1].color)return 0;
            if(A.ca[1].color<B.ca[1].color)return 1;
            return 2;
        }else{
            return 1;
        }
    }
    //A与B中存在顺子
    if(A_Is_Straight||B_Is_Straight){
        if(A_Is_Straight==1){
            if(B_Is_Straight==0)return 0;
            if(A.ca[1].num==14&&A.ca[2].num==3){
                swap(A.ca[1],A.ca[2]);
                swap(A.ca[2],A.ca[3]);
            }
            if(B.ca[1].num==14&&B.ca[2].num==3){
                swap(B.ca[1],B.ca[2]);
                swap(B.ca[2],B.ca[3]);
            }
            if(A.ca[1].num>B.ca[1].num)return 0;
            if(A.ca[1].num<B.ca[1].num)return 1;
            if(A.ca[1].color>B.ca[1].color)return 0;
            if(A.ca[1].color<B.ca[1].color)return 1;
            if(A.ca[2].color>B.ca[2].color)return 0;
            if(A.ca[2].color<B.ca[2].color)return 1;
            if(A.ca[3].color>B.ca[3].color)return 0;
            if(A.ca[3].color<B.ca[3].color)return 1;
            return 2;
        }else{
            return 1;
        }
    }
    
    if(A_Is_Pair||B_Is_Pair){
        if(A_Is_Pair==1){
            if(B_Is_Pair==0)return 0;
            //if(A.ca[1].num==A.ca[3].num)swap(A.ca[2],A.ca[3]);
            if(A.ca[2].num==A.ca[3].num){
                swap(A.ca[1],A.ca[2]);
                swap(A.ca[2],A.ca[3]);
            }
            //if(B.ca[1].num==B.ca[3].num)swap(B.ca[2],B.ca[3]);
            if(B.ca[2].num==B.ca[3].num){
                swap(B.ca[1],B.ca[2]);
                swap(B.ca[2],B.ca[3]);
            }
            if(A.ca[1].num>B.ca[1].num)return 0;
            if(A.ca[1].num<B.ca[1].num)return 1;
            if(A.ca[1].color>B.ca[1].color)return 0;
            if(A.ca[1].color<B.ca[1].color)return 1;
            if(A.ca[2].color>B.ca[2].color)return 0;
            if(A.ca[2].color<B.ca[2].color)return 1;
            
            if(A.ca[3].num>B.ca[3].num)return 0;
            if(A.ca[3].num<B.ca[3].num)return 1;
            if(A.ca[3].color>B.ca[3].color)return 0;
            if(A.ca[3].color<B.ca[3].color)return 1;
            return 2;
        }else{
            return 1;
        }
    }
    
    //散牌的情况
    if(A.ca[1].num>B.ca[1].num)return 0;
    if(A.ca[1].num<B.ca[1].num)return 1;
    if(A.ca[1].color>B.ca[1].color)return 0;
    if(A.ca[1].color<B.ca[1].color)return 1;
    return 2;
}
int main(){
    freopen("poker_test_case.txt","r",stdin);
    //初始化 花色和数字 与转换数字的对应关系
    Init();
    while(scanf("%s",&s)!=EOF){
        //cout<<"case: "<<id<<endl;
        int len=strlen(s);
        int peoNumber=1;
        people peo[3];
        for(int i=0;i<len;i++){
            //花色情况
            if(s[i]=='H'||s[i]=='D'||s[i]=='S'||s[i]=='C'){
                peo[peoNumber].cnt++;
                peo[peoNumber].ca[peo[peoNumber].cnt].color=colorMap[s[i]];
            }
            //数字情况
            if((s[i]>='1'&&s[i]<='9')||(s[i]=='A')||(s[i]=='J')||(s[i]=='Q')||(s[i]=='K')){
                peo[peoNumber].ca[peo[peoNumber].cnt].num=numMap[s[i]];
            }
            //换成下一个人
            if(s[i]==':')peoNumber++;
        }
        
        /*
         //输出转换为数字的牌型
        for(int i=1;i<=peo[1].cnt;i++)cout<<peo[1].ca[i].color<<" "<<peo[1].ca[i].num<<" ";
        //cout<<endl;
        for(int i=1;i<=peo[2].cnt;i++)cout<<peo[2].ca[i].color<<" "<<peo[2].ca[i].num<<"  ";
        cout<<endl;
         */
        int totCard=peo[1].cnt;//牌数
        int ans;
        if(totCard==1){
            ans=JudgeOne(peo[1],peo[2]);
        }
        if(totCard==2){
            ans=JudgeTwo(peo[1],peo[2]);
        }
        if(totCard==3){
            ans=JudgeThree(peo[1],peo[2]);
        }
        if(ans==0)cout<<"First Winner"<<endl;//前者赢
        else if(ans==1) cout<<"Second Winner"<<endl;//后者赢
        else if(ans==2)cout<<"No Winner"<<endl;//两人平手
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值