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 枚举搜索。。的更多相关文章

  1. 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 ...

  2. uva 11210 Chinese Mahjong(暴力搜索)

    Chinese Mahjong Mahjong () is a game of Chinese origin usually played by four persons with tiles res ...

  3. hdu4431 Mahjong

    Mahjong Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submi ...

  4. Luogu 1764 翻转游戏 - 枚举 + 搜索

    题目描述 kkke在一个n*n的棋盘上进行一个翻转游戏.棋盘的每个格子上都放有一个棋子,每个棋子有2个面,一面是黑色的,另一面是白色的.初始的时候,棋盘上的棋子有的黑色向上,有的白色向上.现在kkke ...

  5. HDU - 4431 Mahjong (模拟+搜索+哈希+中途相遇)

    题目链接 基本思路:最理想的方法是预处理处所有胡牌的状态的哈希值,然后对于每组输入,枚举每种新加入的牌,然后用哈希检验是否满足胡牌的条件.然而不幸的是,由于胡牌的状态数过多(4个眼+一对将),预处理的 ...

  6. 枚举+搜索 hdu-4431-Mahjong

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4431 题目大意: 给一副牌,求出所有能糊的牌. 解题思路: 枚举每一张牌,看能不能糊. 因为一共只有 ...

  7. 【ACwing 95】费解的开关——枚举 + 搜索

    (题面来自ACwing) 你玩过"拉灯"游戏吗?25盏灯排成一个5x5的方形.每一个灯都有一个开关,游戏者可以改变它的状态.每一步,游戏者可以改变某一个灯的状态.游戏者改变一个灯的 ...

  8. HDU 4705 Y 树形枚举

    树形枚举--搜索 题目描述: 给你一棵树,要在一条简单路径上选3个不同的点构成一个集合,问能构成多少个不同的集合. 解法: 枚举所有结点,假设某个结点有n棵子树,每棵子树的结点个数分别为s1,s2,` ...

  9. 例 7-10 uva12212(迭代加深搜索)

    题意:对于一段数字,每次可以剪切一段连续的自然数,粘贴到任意部分,使其变成升序 思路: 考虑的是进行搜索,深搜并不能保证是最短,广搜感觉每层的情况太多. 迭代加深:枚举搜索深度,然后进行深搜. 这种方 ...

随机推荐

  1. hdu 1788 Chinese remainder theorem again(最小公倍数)

    Problem Description 我知道部分同学最近在看中国剩余定理,就这个定理本身,还是比较简单的: 假设m1,m2,-,mk两两互素,则下面同余方程组: x≡a1(mod m1) x≡a2( ...

  2. phpmailer{群发并且发送附件}

    PHPMailer是一个用于发送电子邮件的PHP函数包. 第一,需要下载PHPMailer文件包phpmailer. http://phpmailer.sourceforge.net/     第二, ...

  3. Dice (III) 概率dp

    #include <cstdio> #include <iostream> #include <cstring> #include <algorithm> ...

  4. DOM中的范围 createRange()

    学习<JavaScript 高级程序设计> 12章dom范围的笔记 dom2级在Document类型中定义了 createRange()方法: 创建range对象很简单 var range ...

  5. Android中用Application类实现全局变量

    最近在项目中,遇到了application这个类,开始不知道有什么用,经过学习后才知道它的用途也蛮大的,举个例子,如果想在整个应用中使用全局变量,在java中一般是使用静态变量,public类型:而在 ...

  6. Python处理XML

    在Python(以及其他编程语言)内有两种常见的方法处理XML:SAX(Simple API for XML)和DOM(Document Object Model,文档对象模型).SAX语法分析器读取 ...

  7. ubuntu下为opera26.0安装flash

    因为 Adobe Flash 不再支持 linux Google 便开发了PepperFlashPlayer来替代原来的 Adobe Flash 下面介绍 PepperFlashPlayer 在安装方 ...

  8. bzoj 3545&&3551: [ONTAK2010]Peaks &&加强版 平衡树&&并查集合并树&&主席树

    3545: [ONTAK2010]Peaks Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 635  Solved: 177[Submit][Stat ...

  9. web sql Database

    http://www.ibm.com/developerworks/cn/web/1108_zhaifeng_websqldb/ http://baishanheishui.iteye.com/blo ...

  10. Nodejs异步

    http://cnodejs.org/topic/4f16442ccae1f4aa2700113b http://cnodejs.org/topic/4f16442ccae1f4aa27001123 ...