现在的位置: 首页 > 综合 > 正文

hdu 4930 模拟

2019年02月26日 ⁄ 综合 ⁄ 共 3445字 ⁄ 字号 评论关闭

模拟即可

#include<iostream>
#include<cstring>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<map>
using namespace std;
map<char,int>p;
char a[111],b[111];
int an[16],bn[16];//单张
int ad[16],bd[16];//对子
int as[16],bs[16];//三张
int asd[16][16],bsd[16][16];//三带一
int asd2[16][16],bsd2[16][16];
int az[16],bz[16];//炸弹
int aw,bw;//王炸
int a411[16][16][16],b411[16][16][16];//4带1带1
int a42[16][16],b42[16][16];//4带2
int la,lb;
void init()
{
    memset(a,0,sizeof(a));
    memset(b,0,sizeof(b));
    memset(an,0,sizeof(an));
    memset(bn,0,sizeof(bn));
    memset(ad,0,sizeof(ad));
    memset(bd,0,sizeof(bd));
    memset(as,0,sizeof(as));
    memset(bs,0,sizeof(bs));
    memset(asd,0,sizeof(asd));
    memset(bsd,0,sizeof(bsd));
    memset(az,0,sizeof(az));
    memset(bz,0,sizeof(bz));
    memset(a411,0,sizeof(a411));
    memset(b411,0,sizeof(b411));
    memset(a42,0,sizeof(a42));
    memset(b42,0,sizeof(b42));
    memset(asd2,0,sizeof(asd2));
    memset(bsd2,0,sizeof(bsd2));
    aw=0;
    bw=0;
}
bool p42()
{
    for(int i=15;i>=1;i--)
    {
        for(int j=15;j>=1;j--)
        {
            if(a42[i][j])return true;
            if(b42[i][j])return false;
        }
    }
    return false;
}
bool p411()
{
    for(int i=15;i>=1;i--)
    {
        for(int j=15;j>=1;j--)
        {
            for(int k=j-1;k>=1;k--)
            {
                if(a411[i][j][k])return true;
                if(b411[i][j][k])return false;
            }
        }
    }
}
bool p32()
{
    for(int i=15;i>=1;i--)
    {
        for(int j=15;j>=1;j--)
        {
            if(asd2[i][j])return true;
            if(bsd2[i][j])return false;
        }
    }
    return false;
}
bool p31()
{
    for(int i=15;i>=1;i--)
    {
        for(int j=15;j>=1;j--)
        {
            if(asd[i][j])return true;
            if(bsd[i][j])return false;
        }
    }
    return false;
}
bool p3()
{
    for(int i=15;i>=1;i--)
    {
        if(as[i])return true;
        if(bs[i])return false;
    }
    return false;
}
bool p2()
{
    for(int i=15;i>=1;i--)
    {
        if(ad[i])return true;
        if(bd[i])return false;
    }
    return false;
}
bool p1()
{
    for(int i=15;i>=1;i--)
    {
        if(an[i])return true;
        if(bn[i])return false;
    }
    return false;
}
bool solve()
{
    //统计下
    for(int i=1;i<=15;i++)
    {
        if(an[i]>=2)ad[i]=1;
        if(an[i]>=3)
        {
            as[i]=1;
            for(int j=1;j<=15;j++)
            {
                if(i==j)continue;
                if(an[j])asd[i][j]=1;
                if(an[j]>=2)asd2[i][j]=1;
            }
        }
        if(an[i]>=4)
        {
            az[i]=1;
            for(int j=1;j<=15;j++)
            {
                if(i==j)continue;
                if(an[j]>=2)a42[i][j]=1;
                if(an[j])
                {
                    for(int k=1;k<=15;k++)
                    {
                        if(k==i||k==j)continue;
                        if(an[k])a411[i][j][k]=1;
                    }
                }
            }
        }
        if(an[14]&&an[15])aw=1;

        if(bn[i]>=2)bd[i]=1;
        if(bn[i]>=3)
        {
            bs[i]=1;
            for(int j=1;j<=15;j++)
            {
                if(i==j)continue;
                if(bn[j])bsd[i][j]=1;
                if(bn[j]>=2)bsd2[i][j]=1;
            }
        }
        if(bn[i]>=4)
        {
            bz[i]=1;
            for(int j=1;j<=15;j++)
            {
                if(i==j)continue;
                if(bn[j]>=2)b42[i][j]=1;
                if(bn[j])
                {
                    for(int k=1;k<=15;k++)
                    {
                        if(k==i||k==j)continue;
                        if(bn[k])b411[i][j][k]=1;
                    }
                }
            }
        }
        if(bn[15]&&bn[14])bw=1;
    }

    //判断刚好出完
    for(int i=15;i>=1;i--)
    {
        for(int j=15;j>=1;j--)
        {
            if(a42[i][j]&&la==6)return true;
        }
    }

    for(int i=15;i>=1;i--)
    {
        for(int j=15;j>=1;j--)
        {
            for(int k=j-1;k>=1;k--)
            {
                if(a411[i][j][k]&&la==6)return true;
            }
        }
    }

    for(int i=15;i>=1;i--)
    {
        for(int j=15;j>=1;j--)
        {
            if(asd2[i][j]&&la==5)return true;
        }
    }

    for(int i=15;i>=1;i--)
    {
        for(int j=15;j>=1;j--)
        {
            if(asd[i][j]&&la==4)return true;
        }
    }

    for(int i=15;i>=1;i--)
    {
        if(as[i]&&la==3)return true;
    }

    for(int i=15;i>=1;i--)
    {
        if(ad[i]&&la==2)return true;
    }

    for(int i=15;i>=1;i--)
    {
        if(an[i]&&la==1)return true;
    }
    //王炸的情况
    if(bw)return false;
    if(aw)return true;
    //炸弹的情况
    for(int i=15;i>=1;i--)
    {
        if(az[i])return true;
        if(bz[i])return false;
    }
    //各种看大小
    if(p42())return true;
    if(p411())return true;
    if(p32())return true;
    if(p31())return true;
    if(p3())return true;
    if(p2())return true;
    if(p1())return true;
    return false;
}
int main()
{
    //全变成数字好做
    p['3']=1;
    p['4']=2;
    p['5']=3;
    p['6']=4;
    p['7']=5;
    p['8']=6;
    p['9']=7;
    p['T']=8;
    p['J']=9;
    p['Q']=10;
    p['K']=11;
    p['A']=12;
    p['2']=13;
    p['X']=14;
    p['Y']=15;
    int t;
    scanf("%d",&t);
    while(t--)
    {
        init();
        scanf("%s",a);
        scanf("%s",b);
        la=strlen(a);
        for(int i=0;i<la;i++)an[p[a[i]]]++;
        lb=strlen(b);
        for(int i=0;i<lb;i++)bn[p[b[i]]]++;
        if(solve())printf("Yes\n");
        else printf("No\n");
    }
    return 0;
}
【上篇】
【下篇】

抱歉!评论已关闭.