3928 - 斗地主

 规则:
 单张:直接出一张牌     如:3
 对子:出两张一样的牌 如:33
 3张:出3张一样的牌,可以带一张或者一对任意的牌, 如: 333或3334或33344
 顺子:5张大小连续的牌(2不参与顺子) 如:3456789TJQKA
 连对:3对大小连续的牌(2不参与)     如:QQKKAA
 飞机:2个大小连续的3张(2不参与)    如:KKKAAA或KKKAAA56或KKKAAA5566(KKKAAA5不允许)
 炸弹:4张一模一样的牌可带两张任意的牌    如: 3333或333345或33334455

题目输入

一个T表示T组数据    每组数据输入一个字符串表示手牌  字符串长度L<=20

题目输出

输出这个回合能有多少种出牌方法

输入/输出样例

题目输入

3
AA
AAA5
T2KK5J6449J7T35657625K26TA2ATQ

题目输出

2
5
357

C++解答

#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<iostream>
using namespace std;
int sum[15];
int n;
int res=0;
void one()
{
    for(int i=1;i<=13;i++)
    {
        if(sum[i]>=1)
        {
            res++;
        }
    }
}
void dui()
{
    for(int i=1;i<=13;i++)
    {
        if(sum[i]>=2)
        {
            res++;
        }
    }
}
void three()
{
    for(int i=1;i<=13;i++)
    {
        if(sum[i]>=3)
        {
            sum[i]-=3;
            res++;
            for(int j=1;j<=13;j++)
            {
                if(sum[j]>=2) res++;
                if(sum[j]>=1) res++;
            }
            sum[i]+=3;
        }
    }
}
void sz()
{
    int res1=1;
    for(int i=1;i<=8;i++)
    {
        if(sum[i]>=1)
        {
            if(res1==1)
            {
                res1=1;
                for(int j=i+1;j<=12;j++)
                {
                    if(sum[j]>=1)
                    {
                        res1++;
                    }
                    else break;
                }
            }
            else res1--;
            if(res1>=5)
            {
                for(int j=4;j<res1;j++)
                {
                    res++;
                }
            }
        }
    }
}
void ld()
{
    int res1=1;
    for(int i=1;i<=10;i++)
    {
        if(sum[i]>=2)
        {
            if(res1==1)
            {
                res1=1;
                for(int j=i+1;j<=12;j++)
                {
                    if(sum[j]>=2)  res1++;
                    else break;
                }
            }
            else res1--;
            if(res1>=3)
            {
                for(int j=2;j<res1;j++)
                {
                    res++;
                }
            }
        }
    }
}
void fjone(int s,int temp)
{
    if(s==0)
    {
        res++;
        return ;
    }
    for(int i=temp;i<=13;i++)
    {
        if(sum[i]>=1)
        {
            sum[i]--;
            fjone(s-1,i);
            sum[i]++;
        }
    }
}
void fjtwo(int s,int temp)
{
    if(s==0)
    {
        res++;
        return ;
    }
    for(int i=temp;i<=13;i++)
    {
        if(sum[i]>=2)
        {
            sum[i]-=2;
            fjtwo(s-1,i);
            sum[i]+=2;
        }
    }
}
void fj()
{
    int res1=1;
    for(int i=1;i<=11;i++)
    {
        if(sum[i]>=3)
        {
            if(res1==1)
            {
                res1=1;
                for(int j=i+1;j<=12;j++)
                {
                    if(sum[j]>=3)  res1++;
                    else break;
                }
            }
            else res1--;
            if(res1>=2)
            {
                sum[i]-=3;
                for(int j=1;j<res1;j++)
                {
                    sum[i+j]-=3;
                    res++;
                    fjone(j+1,1);
                    fjtwo(j+1,1);
                }
                for(int j=i;j<i+res1;j++) sum[j]+=3;
            }
        }
    }
}
void zd()
{
    for(int i=1;i<=13;i++)
    {
        if(sum[i]==4)
        {
            sum[i]-=4;
            res++;
            fjtwo(2,1);
            sum[i]+=4;
        }
    }
}
void solve()
{
    dui();
    three();
    one();
    sz();
    ld();
    fj();
    zd();
}
char s[105];
int main()
{
    //freopen("input.txt","r",stdin);
    //freopen("output.txt","w",stdout);
    int t;
    scanf("%d",&t);
    while(t--)
    {
        memset(sum,0,sizeof(sum));
        scanf("%s",s);
        int len=strlen(s);
        for(int i=0;i<len;i++)
        {
            if(s[i]>='3'&&s[i]<='9')
                sum[s[i]-'3'+1]++;
            else if(s[i]=='2')
                sum[13]++;
            else if(s[i]=='A')
                sum[12]++;
            else if(s[i]=='K')
                sum[11]++;
            else if(s[i]=='Q')
                sum[10]++;
            else if(s[i]=='J')
                sum[9]++;
            else if(s[i]=='T')
                sum[8]++;
        }
        res=0;
        solve();
        printf("%d\n",res);
    }
}

时间限制 1 秒
内存限制 128 MB
讨论 统计
上一题 下一题