【2014 Multi-University Training Contest 6】 J. Fighting the Landlords(模拟)

来源:互联网 发布:鸟巢大棚建造数据 编辑:程序博客网 时间:2024/05/01 18:01


两人斗地主简化版。己方先出,要求一次出完牌或对方要不起。

模拟,先判断己方能否一次出完,之后就从威力最大的牌开始判断就行了:是否有双王->是否有炸弹->是否有最大单牌->是否有最大pair->是否有3张->3带2->3带1


代码:

#include <cstdio>#include <cmath>#include <cstring>#include <utility>#include <algorithm>#define mod#define len 100010using namespace std;int c1[20];int c2[20];int sum1,sum2;int clear(int c[],int sum1);//判断能否一次性出完int Trio(int c[]);//寻找最大3张int Pair(int c[]);//寻找最大pairint Bomb(int c[]);//寻找最大炸弹int X_Y(int c[]);//判断是否有双王int MAX(int c[]);//寻找最大单牌int clear(int c[],int sum1){    int res=0;    if(sum1==1)        res= 1;    else if(sum1==2&&Pair(c))        res= 1;    else if(sum1==3&&Trio(c))        res= 1;    else if(sum1==4&&(Trio(c)||Bomb(c)))        res=1;    else if(sum1==5&&Trio(c)&&Pair(c))        res=1;    else if(sum1==6&&Bomb(c))        res=1;    else if(X_Y(c))        res=1;    return res;}int Trio(int c[]){    int flag=0;    for(int i=3;i<=17;++i)        if(c[i]==3)        {            flag=i;            //break;        }    return flag;}int Pair(int c[]){    int flag=0;    for(int i=3;i<=17;++i)        if(c[i]==2)        {            flag=i;            //break;        }    return flag;}int Bomb(int c[]){    int flag=0;    for(int i=3;i<=17;++i)        if(c[i]==4)        {            flag=i;            //break;        }    return flag;}int X_Y(int c[]){    int res=0;    if(c[16]==c[17]&&c[16]==1)        res=1;    return res;}int MAX(int c[]){    int flag=0;    for(int i=3;i<=17;++i)        if(c[i]>0)        {            flag=i;            //break;        }    return flag;}int main(){    int T;    char s1[len],s2[len];    scanf("%d",&T);    while(T--)    {        memset(c1,0,sizeof(c1));        memset(c2,0,sizeof(c2));        scanf("%s%s",s1,s2);        sum1=strlen(s1);        sum2=strlen(s2);        for(int i=0;s1[i]!='\0';++i)        {            if(('0'<=s1[i])&&('9'>=s1[i]))                c1[s1[i]-'0']+=1;            if(s1[i]=='2')                c1[15]++;            if(s1[i]=='A')                c1[14]++;            else if(s1[i]=='T')                c1[10]++;            else if(s1[i]=='J')                c1[11]++;            else if(s1[i]=='Q')                c1[12]++;            else if(s1[i]=='K')                c1[13]++;            else if(s1[i]=='X')                c1[16]++;            else if(s1[i]=='Y')                c1[17]++;        }        for(int i=0;s2[i]!='\0';++i)        {            if(('0'<=s2[i])&&('9'>=s2[i]))                c2[s2[i]-'0']+=1;            if(s2[i]=='2')                c2[15]++;            if(s2[i]=='A')                c2[14]++;            else if(s2[i]=='T')                c2[10]++;            else if(s2[i]=='J')                c2[11]++;            else if(s2[i]=='Q')                c2[12]++;            else if(s2[i]=='K')                c2[13]++;            else if(s2[i]=='X')                c2[16]++;            else if(s2[i]=='Y')                c2[17]++;        }        if(clear(c1,sum1))            printf("Yes\n");        else        {            int flag=0;            if(X_Y(c2))                flag=0;            else if(Bomb(c1)>=Bomb(c2)&&Bomb(c1)!=0)                flag=1;            else if(Bomb(c1)<Bomb(c2)&&Bomb(c2)!=0)                flag=0;            else if(Bomb(c1)==Bomb(c2)&&Bomb(c1)==0)            {                if(MAX(c1)>=MAX(c2))                    flag=1;                else if(MAX(c1)<MAX(c2))                {                    if(Trio(c1)>0)//                    {                        if(!Trio(c2))                            flag=1;                        else                        {                            int count1=0,count2=0;                            for(int i=3;i<=17;++i)                                if(c1[i]>=2)                                    count1++;                            for(int i=3;i<=17;++i)                                if(c2[i]>=2)                                    count2++;                            if(count1>1)                            {                                if(count2<=1)                                    flag=1;                                else if(Trio(c1)>=Trio(c2))                                    flag=1;                                else                                    flag=0;                            }                            else                            {                                if(sum2<4)                                    flag=1;                                else if(Trio(c1)>=Trio(c2))                                    flag=1;                                else                                    flag=0;                            }                        }                    }                    else //                     {                        int mark=0;                        for(int i=3;i<=17;++i)                            if(c2[i]>=2)                                mark=i;                        if(Pair(c1)>=mark&&Pair(c1)>0)                            flag=1;                        else                            flag=0;                    }                }            }          printf((flag==1)?"Yes\n":"No\n");        }    }    return 0;}


0 0
原创粉丝点击