UVA 11210 Chinese Mahjong

乍一看很大的一道模拟 其实还好 比斗地主什么的还是好判多了 而且没有什么坑点  首先开一个大小为34的数组来存每张牌有多少个 然后把枚举把每一张牌加进去看和不和( 如果已经有4张 就不能再加了) 首先枚举对子  然后 开始dfs跑顺子和刻子(我们那不这么称呼) 跑出4个就返回1  第一次1A这种模拟题 很开森

 

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cctype>
#include<cmath>
#include<vector>
#include<queue>
#include<map>
#include<algorithm>
#include<set>
#define scnaf scanf
#define cahr char
#define bug puts("bugbugbug");
using namespace std;
typedef long long ll;
const int mod=1000000007;
const int maxn=2000+5;
const int inf=1e9;
const char cha[100][100]=
{
    "1T","2T","3T","4T","5T","6T","7T","8T","9T",
    "1S","2S","3S","4S","5S","6S","7S","8S","9S",
    "1W","2W","3W","4W","5W","6W","7W","8W","9W",
    "DONG","NAN","XI","BEI","ZHONG","FA","BAI"
};
char a[100];
int num[50];
void init()
{
    memset(num,0,sizeof(num));
}
void READ()
{
    for(int i=0; i<34; i++)
    {
        if(strcmp(a,cha[i])==0)
        {
            num[i]++;
            return;
        }
    }
}
int dfs(int cnt)
{
    if(cnt==4)
        return 1;
    for(int i=0; i<34; i++)
        if(num[i])
        {
            if(num[i]>=3)
            {
                num[i]-=3;
                if(dfs(cnt+1))
                {
                    num[i]+=3;
                    return 1;
                }
                num[i]+=3;
            }
            if((i>=0&&i<=6)||(i>=9&&i<=15)||(i>=18&&i<=24))
                if(num[i]&&num[i+1]&&num[i+2])
                {
                    num[i]--;
                    num[i+1]--;
                    num[i+2]--;
                    if(dfs(cnt+1))
                    {
                        num[i]++;
                        num[i+1]++;
                        num[i+2]++;
                        return 1;
                    }
                    num[i]++;
                    num[i+1]++;
                    num[i+2]++;
                }
        }
    return 0;
}
int go()
{
    for(int i=0; i<34; i++)
    {
        if(num[i]>=2)
        {
            num[i]-=2;
            if(dfs(0))
            {
                num[i]+=2;
                return 1;
            }
            num[i]+=2;
        }
    }
    return 0;
}
int main()
{
    int test=1;
    while(~scanf("%s",a))
    {
        init();
        int k=12;
        vector<int>ans;
        if(a[0]=='0')break;
        READ();
        while(k--)
        {
            scnaf("%s",a);
            READ();
        }
        for(int i=0; i<34; i++)
            if(num[i]!=4)
            {
                num[i]++;
                if(go())
                    ans.push_back(i);
                num[i]--;
            }
        printf("Case %d:",test++);
        if(ans.size())
            for(int i=0; i<ans.size(); i++)
                printf(" %s",cha[ans[i]]);
        else printf(" Not ready");
        puts("");
    }
    return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值