Problem E

来源:互联网 发布:java解析器是什么 编辑:程序博客网 时间:2024/06/01 09:59

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最大。

Input

输入第一个数t(t<=10)表示测试用例数。接下来每个用例都有两行,每行包含三张牌,之间用空格隔开。
每张牌的组成是面值(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

5QS TS AHAS 5S ADJC 2H ASAD KD 8S4H 5S 9C7C 3H 5H5D QD ASAH 5S QD3S 3C AD3C 7H JS

Sample Output

LOSSLOSSWINTIE

WIN

这题需要考虑到很多地方,做到吐的感觉,头都大了,可怜,做出来之后还是有感觉的#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;}/*5AS 2S 3SAS KS QS*/



原创粉丝点击