Problem E
Time Limit : 3000/1000ms (Java/Other) Memory Limit : 65535/32768K (Java/Other)
Total Submission(s) : 127 Accepted Submission(s) : 5
Font: Times New Roman | Verdana | Georgia
Font Size: ← →
Problem Description
题目很简单,就是给你两手牌确定那个大。规则如下:
最大的牌型叫【豹子】。【豹子】大于其他任何牌型,同类型中3个A最大,3个2最小。
第二大的牌型叫【顺金】。【顺金】是花色一样的顺子,它比豹子小,但比其余的4种牌型都大。顺金中QKA最大。可以A23,不可以KA2。
第三大的牌型叫做【金花】。【金花】就是花色一样,但不是顺子的三张牌,比较时以最大的一张开始比起,如果最大的一个相同,就从第二个数字比起,以此类推。
第四大的牌型叫做【顺子】。【顺子】是花色不同,三张连续的数字,切记它和【顺金】的差别,是花色不同的三个连续的数字。顺子比对子大,比单牌大,但是比花色一样的任何一种牌型都小。顺子中QKA最大。可以A23,不可以KA2。
第五大的牌型叫做【对子】,对子就是有两张一样的牌,外加一张不同的牌,和豹子的区别就在于豹子是三张一样的而对子只有两张一样的。对子比单牌大,比顺子小,是倒数第二大的牌型。对子与对子之间的比较也是按照对子的大小来比较的。例如对K大于对Q,如果同是对Q,那么就比较第三张牌的大小。对A最大。
第六种牌型【单牌】。凡是没有起到以上5种类型的牌都是单牌,也就是最普通的牌。比较规则是:玩家与玩家比较时先比较最大的那一张,最大的那一张一样的话就比较第二张,以此类推。A最大。
最大的牌型叫【豹子】。【豹子】大于其他任何牌型,同类型中3个A最大,3个2最小。
第二大的牌型叫【顺金】。【顺金】是花色一样的顺子,它比豹子小,但比其余的4种牌型都大。顺金中QKA最大。可以A23,不可以KA2。
第三大的牌型叫做【金花】。【金花】就是花色一样,但不是顺子的三张牌,比较时以最大的一张开始比起,如果最大的一个相同,就从第二个数字比起,以此类推。
第四大的牌型叫做【顺子】。【顺子】是花色不同,三张连续的数字,切记它和【顺金】的差别,是花色不同的三个连续的数字。顺子比对子大,比单牌大,但是比花色一样的任何一种牌型都小。顺子中QKA最大。可以A23,不可以KA2。
第五大的牌型叫做【对子】,对子就是有两张一样的牌,外加一张不同的牌,和豹子的区别就在于豹子是三张一样的而对子只有两张一样的。对子比单牌大,比顺子小,是倒数第二大的牌型。对子与对子之间的比较也是按照对子的大小来比较的。例如对K大于对Q,如果同是对Q,那么就比较第三张牌的大小。对A最大。
第六种牌型【单牌】。凡是没有起到以上5种类型的牌都是单牌,也就是最普通的牌。比较规则是:玩家与玩家比较时先比较最大的那一张,最大的那一张一样的话就比较第二张,以此类推。A最大。
Input
输入第一个数t(t<=10)表示测试用例数。接下来每个用例都有两行,每行包含三张牌,之间用空格隔开。
每张牌的组成是面值(2, 3, 4, 5, 6, 7, 8, 9, T, J, Q, K, A)(其中T代表10)和花色(C, D, H, S)。
每张牌的组成是面值(2, 3, 4, 5, 6, 7, 8, 9, T, J, Q, K, A)(其中T代表10)和花色(C, D, H, S)。
Output
对于每一个用例,如果第一行的牌大,输出“WIN”; 如果第一行的牌小,输出“LOSS”,否则输出“TIE”.
Sample Input
5 QS TS AH AS 5S AD JC 2H AS AD KD 8S 4H 5S 9C 7C 3H 5H 5D QD AS AH 5S QD 3S 3C AD 3C 7H JS
Sample Output
LOSS LOSS WIN TIEWIN
这题需要考虑到很多地方,做到吐的感觉,头都大了,可怜,做出来之后还是有感觉的 #include<cstdio> #include<iostream> #include<algorithm> #include<string> #include<cmath> #include<map> #include<cstring> using namespace std; struct A { char s[3]; int x;//x是由面值变换来的,就是为了方便比较牌的大小,不然T, J, Q, K, A这些字母就不好排序,是吧 } f[3],q[3]; bool cmp(A a,A b) { return a.x>b.x; } int vis; int B(A ff[])//传一个结构体 { if(ff[0].s[0]==ff[1].s[0]&&ff[1].s[0]==ff[2].s[0])//判断是否为豹子 return 1; else if(ff[0].s[1]==ff[1].s[1]&&ff[1].s[1]==ff[2].s[1]&&(ff[0].x==ff[1].x+1&&ff[1].x==ff[2].x+1)||(ff[0].x==14&&ff[1].x==3&&ff[2].x==2)) return 2;//判断是否为顺金,要注意A23这种顺子特殊处理 else if(ff[0].s[1]==ff[1].s[1]&&ff[1].s[1]==ff[2].s[1])//判断是否为金花,这里一定要注意,金花包含对子 { if(ff[0].x==ff[1].x||ff[1].x==ff[2].x)//金花包含对子的话标记一下vis=1 vis=1; return 3; } else if(ff[0].x==ff[1].x+1&&ff[1].x==ff[2].x+1||(ff[0].x==14&&ff[1].x==3&&ff[2].x==2)) return 4;//判断是否为顺子,A23这种顺子也特殊处理 else if((ff[0].s[0]==ff[1].s[0])||(ff[1].s[0]==ff[2].s[0])) return 5;//判断是否是对子 return 6;//其他就什么都不是了 } int main() { int n; while(~scanf("%d",&n)) { while(n--) { vis=0; for(int i=0; i<3; i++) { scanf("%s",f[i].s); if(f[i].s[0]=='T') f[i].x=10; else if(f[i].s[0]=='J') f[i].x=11; else if(f[i].s[0]=='Q') f[i].x=12; else if(f[i].s[0]=='K') f[i].x=13; else if(f[i].s[0]=='A') f[i].x=14; else f[i].x=f[i].s[0]-'0';//这一部分就是将面值转换成数字,方便比较大小 } sort(f,f+3,cmp);//排序 for(int i=0; i<3; i++)//这个和上面一样处理 { scanf("%s",q[i].s); if(q[i].s[0]=='T') q[i].x=10; else if(q[i].s[0]=='J') q[i].x=11; else if(q[i].s[0]=='Q') q[i].x=12; else if(q[i].s[0]=='K') q[i].x=13; else if(q[i].s[0]=='A') q[i].x=14; else q[i].x=q[i].s[0]-'0'; } sort(q,q+3,cmp);//排序 //到这里就得到了排好序的两副牌了 int ok=B(f); int flag=vis;//flag=1等于1的话就是说f的这副牌是金花同时也是对子 vis=0; int op=B(q); int flbg=vis;//同上,ok和op是表示属于哪类牌型,比如ok=1就是豹子 //printf("%d %d\n",ok,op); if(ok==op)//如果两幅牌型一样 { if(ok==5&&f[1].x==f[2].x)//牌型都是对子,而且是7 4 4这样的(前面两个数相同的对子),而不是8 7 7这样的(后面两个数相同的对子) { if(f[1].x>q[1].x) printf("WIN\n"); else if(f[1].x==q[1].x) { if(f[0].x>q[0].x) printf("WIN\n"); else if(f[0].x==q[0].x) printf("TIE\n"); else printf("LOSS\n"); } else printf("LOSS\n"); } else if(ok==3&&(flag==1||flbg==1))//牌型是金花,并且其中至少有一副牌含有对子 { if(flag==1&&flbg==0)//f含有对子 printf("WIN\n"); else if(flag==0&&flbg==1)//g含有对子 printf("LOSS\n"); else//都含有对子 { if(f[1].x>q[1].x) printf("WIN\n"); else if(f[1].x<q[1].x) printf("LOSS\n"); else { if(f[0].x==f[1].x&&q[1].x==q[2].x) printf("LOSS\n"); else if(f[1].x==f[2].x&&q[1].x==q[0].x) printf("WIN\n"); else if(f[1].x==f[0].x&&q[1].x==q[0].x) { if(f[2].x>q[2].x) printf("WIN\n"); else if(f[2].x<q[2].x) printf("LOSS\n"); else printf("TIE\n"); } else if(f[2].x==f[1].x&&q[1].x==q[2].x) { if(f[0].x>q[0].x) printf("WIN\n"); else if(f[0].x<q[0].x) printf("LOSS\n"); else printf("TIE\n"); } } } } else { if(f[0].x>q[0].x) printf("WIN\n"); else if(f[0].x==q[0].x) { if(f[1].x>q[1].x) printf("WIN\n"); else if(f[1].x==q[1].x) { if(f[2].x>q[2].x) printf("WIN\n"); else if(f[2].x==q[2].x) printf("TIE\n"); else printf("LOSS\n"); } else printf("LOSS\n"); } else printf("LOSS\n"); } } if(ok<op)//ok越小,说明牌越大 printf("WIN\n"); else if(ok>op)//ok大,说明牌小 printf("LOSS\n"); } } return 0; } /* 5 AS 2S 3S AS KS QS */