UVa中国麻将(Chinese Mahjong,Uva 11210)
2024-08-29 16:15:07
简单的回溯题
#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 ;
}
最新文章
- Java图形化界面设计——布局管理器之FlowLayout(流式布局)
- Java byte数据类型详解
- 【数据结构】 字符串&;KMP子串匹配算法
- storm消费kafka实现实时计算
- ASP.NET Core - 从Program和Startup开始
- [LeetCode] Binary Tree Pruning 二叉树修剪
- dis集群研究和实践(基于redis 3.0.5) 《转载》
- springboot 创建非web项目及数据源简单使用
- console 命令进行 JS 调试的灵活用法
- EasyUI-datebox设置开始日期小于结束日期,并且结束日期小于当前日期
- ASP.NET Core使用TopShelf部署Windows服务
- python测试webservice接口
- zcat,zgrep用法
- UILabel部分文字可点击
- django~项目的文件位置的重要性
- 春夏秋冬又一春之Redis持久化
- React Native(四)——顶部以及底部导航栏实现方式
- MySQL在windows下的图形安装
- 关于卫星RNSS与RDSS
- 西邮Linux兴趣小组纳新笔试试题