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;//两人平手
}
}