UVa中国麻将(Chinese Mahjong,Uva 11210)

简单的回溯题

 #include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std; char *mahjong[]={
"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"
}; int convert(char *s)//映射处理
{
for(int i=;i<;i++)
if(strcmp(mahjong[i],s)==)
return i;
return -;
} int c[]; bool search(int dep)
{
for(int i=;i<;i++)//枚举刻子
if(c[i]>=)
{
if(dep==) return true;
c[i]-=;
if(search(dep+)) return true;
c[i]+=;
}
for(int i=;i<;i++)//枚举顺子
if(i%<=&&c[i]>=&&c[i+]>=&&c[i+]>=)
{
if(dep==) return true;
c[i]--;c[i+]--;c[i+]--;
if(search(dep+)) return true;
c[i]++;c[i+]++;c[i+]++;
}
return false;
} bool check()
{
for(int i=;i<;i++)//枚举将牌
if(c[i]>=)
{
c[i]-=;
if(search()) return true;
c[i]+=;
}
return false;
} int main()
{
int casen=;
int mj[];
char s[];
bool ok;
while(cin>>s)
{
if(s[]=='') break;
printf("Case %d:",++casen);
mj[]=convert(s);
for(int i=;i<;i++)
{
cin>>s;
mj[i]=convert(s);
}
ok=false;
for(int i=;i<;i++)//枚举听牌
{
memset(c,,sizeof(c));
for(int j=;j<;j++) c[mj[j]]++;
if(c[i]>=) continue;
c[i]++;
if(check())
{
ok=true;
printf(" %s",mahjong[i]);
}
c[i]--;
}
if(!ok)
printf(" Not ready");
printf("\n");
}
return ;
}
上一篇:Spring Boot:如何配置静态资源的地址与访问路径


下一篇:Chinese Mahjong UVA - 11210 (DFS)