ZOJ1111 Poker Hands(模拟)

终于啃下来了,我类个去啊,那题意,真心纠结啊……

要是按我原来的理解,这个题基本就是无解,不过,后来 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;
}


你可能感兴趣的:(游戏,c,UP,pair)