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(迭代加深搜索)
题意:对于一段数字,每次可以剪切一段连续的自然数,粘贴到任意部分,使其变成升序 思路: 考虑的是进行搜索,深搜并不能保证是最短,广搜感觉每层的情况太多. 迭代加深:枚举搜索深度,然后进行深搜. 这种方 ...
随机推荐
- OC - 18.监听iPhone的网络状态
使用系统的方法来监听网络状态 系统的方法是通过通知机制来实现网络状态的监听 实现网络状态监听的步骤 定义Reachability类型的成员变量来保存网络的状态 @property (nonatomic ...
- iOS Core Animation学习总结(1)--CALayer常用属性
图层是core animation的基础, UIView之所以能显示在屏幕上,靠的是其内部的这个图层,即每个UIView 都有 CALayer,可通过UIView.layer或者[UIView lay ...
- O-C相关-03:面向对象概念的具体介绍
1.面向对象的概念 面向对象(object-oriented ;简称: OO) 至今还没有统一的概念,我这里把它定义为:按人们认识客观世界的系统思维方式,采用基于对象(实体)的概念建立模型,模拟客观世 ...
- java获取远程网络图片文件流、压缩保存到本地
1.获取远程网路的图片 /** * 根据地址获得数据的字节流 * * @param strUrl * 网络连接地址 * @return */ public static byte[] getImage ...
- nginx利用limit模块设置IP并发防CC攻击
nginx利用limit模块设置IP并发防CC攻击 分类: 系统2013-01-21 09:02 759人阅读 评论(0) 收藏 举报 来源:http://blog.xencdn.net/nginx- ...
- demo_02 less
html 中的代码<!DOCTYPE html> <html> <head> <meta charset="utf-8" /> &l ...
- C#连接、访问MySQL数据库
一.准备工具 visual stuido(本示例使用visual studio 2010) MySql.Data.dll mysql_installer_community_V5.6.21.1_set ...
- smarty模板引擎原理解析
//php 控制器文件 <?php//引入模板引擎文件include("20130304.php");$smarty =newTinySmarty();$qq_numbers ...
- 数据库基本概念-oracle介绍
甲骨文公司,全称甲骨文股份有限公司是全球最大的企业软件公司,总部位于美国加利福尼亚州的红木滩.甲骨文是继Microsoft及IBM后,全球收入第三多的软件公司.甲骨文公司1989年正式进入中国市场.重 ...
- Administration Commands
Commands useful for administrators of a hadoop cluster. balancer Runs a cluster balancing utility. A ...