HDU

题目大意:和hdu4431差不多

就是胡的方法只有hdu4431的第一种

然后sbc,scmp这些表示牌的字符不同

要注意的还有输出牌的顺序(s,b,c)

AC代码

#include<bits/stdc++.h>
using namespace std;
int T,n,i,j,ans,answer[1000];
string str;
int have[100];
int sum[100],t;
int num(string str)
{
    int t=str[0]-'1';
    if(str[1]=='s')t+=0;
    else if(str[1]=='b')t+=9;
    else if(str[1]=='c')t+=18;
    return t;
}
bool ok4X3()
{
    int ret=0,tmp[35];
    for(int i=0; i<27; i++)tmp[i]=sum[i];
    for(int i=0; i<=18; i+=9)
        for(int j=0; j<9; j++)
        {
            if(tmp[i+j]>=3)tmp[i+j]-=3,ret++;
            while(j+2<9&&tmp[i+j]&&tmp[i+j+1]&&tmp[i+j+2])tmp[i+j]--,tmp[i+j+1]--,tmp[i+j+2]--,ret++;
        }
    if(ret==4)return true;
    return false;
}
bool ok1()
{
    for(int i=0; i<27; i++)
    {
        if(sum[i]>=2)
        {
            sum[i]-=2;
            if(ok4X3()){sum[i]+=2;return true;}
            sum[i]+=2;
        }
    }
    return false;
}

bool ok()
{
    for (int i=0;i<=26;i++)if(sum[i]>4)return false;
    if(ok1())return true;
    return false;
}
int main()
{
    scanf("%d",&T);
    while (T--)
    {
        t++;
        memset(sum,0,sizeof(sum));
        memset(answer,0,sizeof(answer));
        ans=0;
        for (i=1; i<=13; i++)cin>>str,have[i]=num(str),sum[have[i]]++;
        for (i=0; i<=26; i++)
        {
            have[14]=i;
            sum[have[14]]++;
            if(ok())
            {
                ans++;
                answer[ans]=i;
            }
            sum[have[14]]--;
        }
        printf("Case %d:",t);
        if(ans)
        {
            for (i=1; i<=ans; i++)
            {
                printf(" %d",(answer[i]%9)+1);
                if(answer[i]/9==0)printf("s");
                else if(answer[i]/9==1)printf("b");
                else if(answer[i]/9==2)printf("c");
            }
            puts("");
        }
        else puts(" None");
    }
    return 0;
}
原文地址:https://www.cnblogs.com/Orange-User/p/7797224.html