ZOJ1111 Poker Hands(模拟)

来源:互联网 发布:mysql 数据类型 编辑:程序博客网 时间:2024/04/27 21:53

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

要是按我原来的理解,这个题基本就是无解,不过,后来 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+1else 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+1else return 7;//2+2+1}else if(ans==3)return 8;//2+1+1+1else if(ans==4)return 9;return 0;}int find_one(Node * a){//找到 2+2+1 中的那个 1int 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 中的那个 2int 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;}


原创粉丝点击