ZOJ 1111 Poker Hands(シミュレーション)


ついにかじって、私は类が行って、あの题意、心から葛藤します......
私のもとの理解によって、この问题は基本的に无解ですが、后でXYは意外にもYYの方法を过ぎて、彼女に闻いて、やっと知っていて、私は间违っています......
タイトル:
ハウスというゲームで、以前電子辞書で遊んだことを覚えています.二人で、一人に五枚のカードを出して、花の色によって、まだ点数があって誰が勝つかを決めます.この問題はカードの組み合わせを8種類に分けて、それぞれのタイプには1つのレベルがあり、レベルの高いものは必ずレベルの低い組み合わせに勝つことができます.二人のカードのレベルが同じなら、タイトルの説明に従って比較を続け、まだ比べられない場合は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;
}