终于啃下来了,我类个去啊,那题意,真心纠结啊……
要是按我原来的理解,这个题基本就是无解,不过,后来 XY 在竟然 YY 个方法过了,问她,才知道,我理解错了……
题意:
就是那个叫豪斯的游戏,以前记得在电子词典上玩过的。说是两个人,一人发五张牌,根据花色,还有点数决定谁赢。这个题把牌的组合给分成了8种类型,每种类型都有一个级别,级别高的一定能赢级别低的组合;如果俩人的牌的级别一样,就按题目的描述继续比较,如果还比不出来,直接输出 Tie 。
没啥了,按题目要求模拟吧,这是个体力活……
代码:
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
struct Node{
int num,mark;
}black[6],white[6];
int val(char x){
int a;
if(x>='2' && x<='9')a=x-'0';
else if(x=='T')a=10;
else if(x=='J')a=11;
else if(x=='Q')a=12;
else if(x=='K')a=13;
else if(x=='A')a=14;
else if(x=='C')a=1;
else if(x=='D')a=2;
else if(x=='H')a=3;
else if(x=='S')a=4;
return a;
}
int cmp(Node a,Node b){
return a.num < b.num;
}
int up[6];
int same(Node * a){//j值从0~4共5种可能,表示5张牌中有多少不同点数
int i,j=0;
for(i=2;i<=5;i++){
if(a[i].num!=a[i-1].num)up[j++]=i;
}return j;
}
int judge(Node * a){//先判断级别
int flag1=0,flag2=0;
if(a[1].mark==a[2].mark && a[2].mark==a[3].mark && a[3].mark==a[4].mark && a[4].mark==a[5].mark)
flag1=1;//同花
if(a[1].num+1==a[2].num && a[2].num+1==a[3].num && a[3].num+1==a[4].num && a[4].num+1==a[5].num)
flag2=1;//顺子
if(flag1 && flag2)return 1;//同花顺
else if(flag1 && !flag2)return 4;//同花
else if(!flag1 && flag2)return 5;//顺子
int ans=same(a);
if(ans==0)return 2;//4+1
else if(ans==1){
if(up[0]==2 || up[0]==5)return 2;
if(up[0]==3 || up[0]==4)return 3;//3+2
}
else if(ans==2){
if(up[0]==2&&up[1]==3 || up[0]==2&&up[1]==5 || up[0]==4&&up[1]==5)return 6;//3+1+1
else return 7;//2+2+1
}
else if(ans==3)return 8;//2+1+1+1
else if(ans==4)return 9;
return 0;
}
int find_one(Node * a){//找到 2+2+1 中的那个 1
int i;
for(i=1;i<=5;i++){
if(i==1 && a[i].num!=a[i+1].num)return 1;
else if(i==5 && a[i].num!=a[i-1].num)return 5;
else if(a[i].num!=a[i-1].num && a[i].num!=a[i+1].num)return i;
}return 0;
}
int find_pair(Node * a){//找到 2+1+1+1 中的那个 2
int i;
for(i=1;i<=5;i++){
if(i==1 && a[i].num==a[i+1].num)return 2;
else if(a[i].num==a[i-1].num)return i;
}return 0;
}
int compare(int x){//相同级别之间的比较
int i,j,k,a,b;
if(x==1){
if(black[5].num==white[5].num)return 0;
else if(black[5].num>white[5].num)return 1;
else return -1;
}
else if(x==2 || x==3){
if(black[3].num==white[3].num)return 0;
else if(black[3].num>white[3].num)return 1;
else return -1;
}
else if(x==4 || x==9){
for(i=5;i>=1;i--){
if(black[i].num<white[i].num)return -1;
else if(black[i].num>white[i].num)return 1;
}return 0;
}
else if(x==5){
if(black[5].num==white[5].num)return 0;
else if(black[5].num>white[5].num)return 1;
else return -1;
}
else if(x==6){
if(black[3].num==white[3].num)return 0;
else if(black[3].num>white[3].num)return 1;
else return -1;
}
else if(x==7){
if(black[4].num<white[4].num)return -1;
else if(black[4].num>white[4].num)return 1;
else if(black[4].num==white[4].num){
if(black[2].num<white[2].num)return -1;
else if(black[2].num>white[2].num)return 1;
else if(black[2].num==white[2].num){
a=find_one(black);
b=find_one(white);
if(black[ a ].num==white[ b ].num)return 0;
else if(black[ a ].num > white[ b ].num)return 1;
else return -1;
}
}
}
else if(x==8){
a=find_pair(black);
b=find_pair(white);
int tmp_a[6],tmp_b[6];
for(j=k=i=1;i<=5;i++){
if(i!=a && i!=a-1)tmp_a[j++]=black[i].num;
if(i!=b && i!=b-1)tmp_b[k++]=white[i].num;
}
if(black[a].num<white[b].num)return -1;
else if(black[a].num>white[b].num)return 1;
else {
for(i=3;i>=1;i--){
if(tmp_a[i]<tmp_b[i])return -1;
else if(tmp_a[i]>tmp_b[i])return 1;
}return 0;
}
}return 0;
}
int main()
{
char str[3];
int i,j,k;
while(~scanf("%2s",str)){
j=k=1;
black[j].num=val(str[0]);
black[j++].mark=val(str[1]);
for(i=2;i<=10;i++){
scanf("%2s",str);
if(i<6){
black[j].num=val(str[0]);
black[j++].mark=val(str[1]);
}
else {
white[k].num=val(str[0]);
white[k++].mark=val(str[1]);
}
}
sort(black+1,black+6,cmp);
sort(white+1,white+6,cmp);
int degree_black=judge(black);
int degree_white=judge(white);
if(degree_black < degree_white)puts("Black wins.");
else if(degree_black > degree_white)puts("White wins.");
else {
int x=compare(degree_black);
if(x==1)puts("Black wins.");
else if(x==-1)puts("White wins.");
else puts("Tie.");
}
}
return 0;
}