UVA 11210 Chinese Mahjong

来源:互联网 发布:极光网络魔戒世界礼包 编辑:程序博客网 时间:2024/06/11 05:36

乍一看很大的一道模拟 其实还好 比斗地主什么的还是好判多了 而且没有什么坑点  首先开一个大小为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
原创粉丝点击