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