hdu4431 Mahjong 枚举搜索。。
japanese麻将什么玩意。。都没有豪华七对。。。
没什么难的 就是枚举搜索了
分三种类型的胡牌
f1是七对 f2是十三幺 f3是普通的胡牌 就先找一对 再找三个三个的
就是一直超时。。在峰峰的指导下加了好多剪枝 注释都标出来了。。这样才过 而且好慢。。
#include <iostream>
#include <cstring>
#include <string>
#include <cstdio>
#include <algorithm>
#include <vector>
#include <map>
using namespace std; int cnt[40],res,ans[40];
map<string,int>mp;
void init()
{
mp["1m"]=1; mp["1s"]=11; mp["1p"]=21;
mp["2m"]=2; mp["2s"]=12; mp["2p"]=22;
mp["3m"]=3; mp["3s"]=13; mp["3p"]=23;
mp["4m"]=4; mp["4s"]=14; mp["4p"]=24;
mp["5m"]=5; mp["5s"]=15; mp["5p"]=25;
mp["6m"]=6; mp["6s"]=16; mp["6p"]=26;
mp["7m"]=7; mp["7s"]=17; mp["7p"]=27;
mp["8m"]=8; mp["8s"]=18; mp["8p"]=28;
mp["9m"]=9; mp["9s"]=19; mp["9p"]=29;
mp["1c"]=31;mp["2c"]=32; mp["3c"]=33;
mp["4c"]=34;mp["5c"]=35; mp["6c"]=36;
mp["7c"]=37;
} int f1()//7dui
{
int a=0;
for(int i=1;i<=38;i++)
{
if(cnt[i]==2) a++;
}
return a==7;
} int f2()//13yao
{
int i,j;
for(i=0;i<30;i+=10)
{
if(!cnt[i+1]||!cnt[i+9]) return 0;
for(j=2;j<9;j++)
if(cnt[i+j]) return 0;
}
for(i=31;i<=37;i++)
if(!cnt[i]) return 0;
return 1;
} int dfs()
{
int i;
if(res==0) return 1;
for(i=1;i<30;i++)
{
if(cnt[i]>=3)
{
cnt[i]-=3;
res-=3;
if(dfs()){
cnt[i]+=3;
res+=3;
return 1;
}
cnt[i]+=3;
res+=3;
}
}
for(i=1;i<30;i++)
{
if(cnt[i]&&cnt[i+1]&&cnt[i+2])
{
cnt[i]--;
cnt[i+1]--;
cnt[i+2]--;
res-=3;
if(dfs()){
cnt[i]++;
cnt[i+1]++;
cnt[i+2]++;
res+=3;
return 1;
}
cnt[i]++;
cnt[i+1]++;
cnt[i+2]++;
res+=3;
}
}
return 0;
} int f3()
{
int i;
for(i=1;i<38;i++)
if(cnt[i]>=2)
{
cnt[i]-=2;
res=12;
int ok=1;//这里再加一个剪枝 先找出连不成一句话的三个一样的
for(int j=31;j<=37;j++)
{
if(cnt[j]==3) res-=3;//减小dfs
else if(cnt[j]) {ok=0;break;}
}
if(!ok) {cnt[i]+=2;continue;}
if(dfs())
{
cnt[i]+=2;
return 1;
}
cnt[i]+=2;
}
return 0;
} int main()
{
int t,i,k;
char s[5];
init();
scanf("%d",&t);
while(t--)
{
memset(cnt,0,sizeof cnt);
for(i=0;i<13;i++)
{
scanf("%s",s);
cnt[mp[s]]++;
}
for(i=1,k=0;i<=37;i++)
{
if(i%10==0||cnt[i]==4) continue;//如果这张牌已经有四个就不用加啦
cnt[i]++;
if(cnt[i]==4&&!cnt[i-1]&&!cnt[i+1]){
cnt[i]--;//如果这张牌有四个 且相邻两个都没有 那一定不能胡
continue;
}
if(f2()){
ans[k++]=i;
cnt[i]--;
continue;
}
else if(cnt[i]==1&&!cnt[i-1]&&!cnt[i+1]){
cnt[i]--;//判断为不是十三幺后
continue;//如果这张牌只有一个 而且前后都没有 那一定不能胡
}
if(f1()||f3())
ans[k++]=i;
cnt[i]--;
}
if(k)
{
// sort(ans.begin(),ans.end());//mark
printf("%d",k);
for(i=0;i<k;i++)
{
if(ans[i]<10)
printf(" %dm",ans[i]%10);
else if(ans[i]<20)
printf(" %ds",ans[i]%10);
else if(ans[i]<30)
printf(" %dp",ans[i]%10);
else printf(" %dc",ans[i]%10);
}
putchar('\n');
}
else printf("Nooten\n");
}
return 0;
}
hdu4431 Mahjong 枚举搜索。。的更多相关文章
- HDU 4900 NO ACM NO LIFE(概率+枚举+搜索)(2014 Multi-University Training Contest 4)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4900 Problem Description There is an old country and ...
- uva 11210 Chinese Mahjong(暴力搜索)
Chinese Mahjong Mahjong () is a game of Chinese origin usually played by four persons with tiles res ...
- hdu4431 Mahjong
Mahjong Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submi ...
- Luogu 1764 翻转游戏 - 枚举 + 搜索
题目描述 kkke在一个n*n的棋盘上进行一个翻转游戏.棋盘的每个格子上都放有一个棋子,每个棋子有2个面,一面是黑色的,另一面是白色的.初始的时候,棋盘上的棋子有的黑色向上,有的白色向上.现在kkke ...
- HDU - 4431 Mahjong (模拟+搜索+哈希+中途相遇)
题目链接 基本思路:最理想的方法是预处理处所有胡牌的状态的哈希值,然后对于每组输入,枚举每种新加入的牌,然后用哈希检验是否满足胡牌的条件.然而不幸的是,由于胡牌的状态数过多(4个眼+一对将),预处理的 ...
- 枚举+搜索 hdu-4431-Mahjong
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4431 题目大意: 给一副牌,求出所有能糊的牌. 解题思路: 枚举每一张牌,看能不能糊. 因为一共只有 ...
- 【ACwing 95】费解的开关——枚举 + 搜索
(题面来自ACwing) 你玩过"拉灯"游戏吗?25盏灯排成一个5x5的方形.每一个灯都有一个开关,游戏者可以改变它的状态.每一步,游戏者可以改变某一个灯的状态.游戏者改变一个灯的 ...
- HDU 4705 Y 树形枚举
树形枚举--搜索 题目描述: 给你一棵树,要在一条简单路径上选3个不同的点构成一个集合,问能构成多少个不同的集合. 解法: 枚举所有结点,假设某个结点有n棵子树,每棵子树的结点个数分别为s1,s2,` ...
- 例 7-10 uva12212(迭代加深搜索)
题意:对于一段数字,每次可以剪切一段连续的自然数,粘贴到任意部分,使其变成升序 思路: 考虑的是进行搜索,深搜并不能保证是最短,广搜感觉每层的情况太多. 迭代加深:枚举搜索深度,然后进行深搜. 这种方 ...
随机推荐
- React学习笔记(三) 组件传值
组件嵌套后,父组件怎么向子组件发送数据呢? 答案是: this.props <script type="text/babel"> var MyFirst = React ...
- dx环境搭建
我使用的是vs2012+DXSDK_Jun10 DXSDK_Jun10下载地址http://download.microsoft.com/download/A/E/7/AE743F1F-632B-48 ...
- asp.net取HTML控件值
asp.net取HTML控件值所有html表单里面的值控件,提交后都是以键值 key=value&key=value&……这样的形式提交给后台. radio也一样,会将选中的radio ...
- 2、Python djang 框架下的word Excel TXT Image 等文件的下载
2.python实现文件下载 (1)方法一.直接用a标签的href+数据库中文件地址,即可下载.缺点:word excel是直接弹框下载,对于image txt 等文件的下载方式是直接在新页面打开. ...
- JavaScript学习心得(八)
Cookie是Netscape发明的技术,是动态网站必不可少的部分,用于浏览器请求Web页面的超文本传输协议是一种无状态的协议. 两种方法维护状态:使用会话(session)(使用服务器技术实现,数据 ...
- Centos7 修改运行级别
systemd使用比sysvinit的运行级别更为自由的target概念作为替代 第三运行级: multi-user.target 第五运行级: graphical.target #前者是符号链接 ...
- Sql Server2000,2005,2008各版本主要区别
Emerson回来之后,在过程中遇到的一些问题,再次做一些整理,包括本篇的Sql Server各版本之间的区别和另一篇数据库函数. (博文内容来自网络) 数据类型 SQL Server 2008 数据 ...
- cygwin使用
Cygwin是一个在windows平台上运行的类UNIX模拟环境,是cygnus solutions公司开发的自由软件(该公司开发的著名工具还有eCos,不过现已被Redhat收购). 它对于学习UN ...
- asp.net学习
http://www.cnblogs.com/fish-li/archive/2011/12/27/2304063.html
- nutch 采集效率问题
http://hi.baidu.com/jacklin/item/a8fbccf479f6a1d042c36a7c再附一篇:http://blog.csdn.net/laigood/article/d ...