Problem E

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

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
TIE

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;
}
/*
5
AS 2S 3S
AS KS QS
*/



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值