HDU - 3391 C - Mahjong
题意:如果摸到的14张麻将,可以组成4副三张麻将连续或者相同的,以及两个一样的就能获胜。
思路:直接暴力枚举每种可以摸到的牌型,用dfs判断当前拿到的14张牌型能否获胜。
如果搜索时不优化会超时,如果你选择了第cur张牌,那么你下次不必再选择cur以前的牌,因为会造成重复搜索。加上这个剪枝就能过掉。我还自己加了一个剪枝:先排序,然后如果组合到第cur张牌,前面还有牌没有组合,说明不可能组合完,因为每张牌只会和它自身以及比它更大的牌组合。
字符的处理:s、b、c看做0,1,2,那么1s就表示10,5b表示51,就能愉快地转换成数字了。
AC代码:78ms
#include <cstdio> #include <cmath> #include <algorithm> #include <cstring> #include <utility> #include <string> #include <iostream> #include <map> #include <set> #include <vector> #include <queue> #include <stack> using namespace std; #define eps 1e-10 #define inf 0x3f3f3f3f #define PI pair<int, int> typedef long long LL; const int maxn = 100+5; char p[] = {'s', 'b', 'c'}; int vis[maxn], cnt[maxn], a[20]; bool dfs(int k, int cur) { for(int i = 0; i < cur; ++i) { //剪枝 if(cnt[a[i]]) return false; } if(k == 5) return true; if(k == 0) { for(int i = 0; i < 14; ++i) { int x = a[i]; if(cnt[x] >= 2 && !vis[x]) { vis[x] = 1; cnt[x] -= 2; if(dfs(k+1, cur)) return true; cnt[x] += 2; } } } else { for(int i = cur; i < 14; ++i) { int x = a[i]; //取三个一样的 if(cnt[x] >= 3) { cnt[x] -= 3; if(dfs(k+1, i)) return true; cnt[x] += 3; } //取三个连续的 int y = x / 10, z = x % 10; if(y + 2 <= 9) { int flag = 1; for(int j = 0; j < 3; ++j) { if(!cnt[(y+j)*10+z]) { flag = 0; break; } } if(flag) { for(int j = 0; j < 3; ++j) cnt[(y+j)*10+z]--; if(dfs(k+1, i)) return true; for(int j = 0; j < 3; ++j) cnt[(y+j)*10+z]++; } } } } return false; } int main() { char ma[5]; int T, kase = 1; scanf("%d", &T); while(T--) { memset(cnt, 0, sizeof(cnt)); for(int i = 0; i < 13; ++i) { scanf("%s", ma); for(int j = 0; j < 3; ++j) { if(ma[1] == p[j]) { a[i] = (ma[0]-'0')*10+j; cnt[a[i]]++; } } } int old[maxn] , b[maxn]; memcpy(old, cnt, sizeof(cnt)); memcpy(b, a, sizeof(a)); printf("Case %d:", kase++); int ans = 0; for(int i = 0; i <= 2; ++i) for(int j = 1; j <= 9; ++j) { int x = j * 10 + i; if(cnt[x] == 4) continue; memset(vis, 0, sizeof(vis)); memcpy(cnt, old, sizeof(old)); memcpy(a, b, sizeof(a)); a[13] = x; sort(a, a+14); cnt[x]++; if(dfs(0, 0)) { ++ans; printf(" %d%c", j, p[i]); } } if(!ans) printf(" None"); printf("\n"); } return 0; }
如有不当之处欢迎指出!
HDU - 3391 C - Mahjong的更多相关文章
- HDU 5379 Mahjong tree(dfs)
题目链接:pid=5379">http://acm.hdu.edu.cn/showproblem.php? pid=5379 Problem Description Little su ...
- HDU 5379 Mahjong tree(树的遍历&组合数学)
本文纯属原创,转载请注明出处.谢谢. http://blog.csdn.net/zip_fan 题目传送门:http://acm.hdu.edu.cn/showproblem.php? pid=537 ...
- Hdu 5379 Mahjong tree (dfs + 组合数)
题目链接: Hdu 5379 Mahjong tree 题目描述: 给出一个有n个节点的树,以节点1为根节点.问在满足兄弟节点连续 以及 子树包含节点连续 的条件下,有多少种编号方案给树上的n个点编号 ...
- HDU 4431 Mahjong (DFS,暴力枚举,剪枝)
题意:给定 13 张麻将牌,问你是不是“听”牌,如果是输出“听”哪张. 析:这个题,很明显的暴力,就是在原来的基础上再放上一张牌,看看是不是能胡,想法很简单,也比较好实现,结果就是TLE,一直TLE, ...
- 2015多校第7场 HDU 5379 Mahjong tree 构造,DFS
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5379 题意:一颗n个节点n-1条边的树,现在要给每个节点标号(1~n),要求:(1)每一层的兄弟节点的 ...
- HDU 4431 Mahjong(枚举+模拟)(2012 Asia Tianjin Regional Contest)
Problem Description Japanese Mahjong is a four-player game. The game needs four people to sit around ...
- HDU 5379——Mahjong tree——————【搜索】
Mahjong tree Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Tota ...
- 2015 Multi-University Training Contest 7 hdu 5379 Mahjong tree
Mahjong tree Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Tota ...
- HDU 4431 Mahjong 模拟
http://acm.hdu.edu.cn/showproblem.php?pid=4431 不能说是水题了,具体实现还是很恶心的...几乎优化到哭但是DFS(还加了几个剪枝)还是不行...搜索一直T ...
随机推荐
- Shell读取配置文件的方法
参考:http://www.cnblogs.com/binbinjx/p/5680214.html 做批量软件安装自动化时,都喜欢用配置文件的方式改变参数,那怎么通过shell读取配置文件的配置呢?参 ...
- 【转】Matlab中的括号()[] {}
Matlab中经常会用到括号去引用某Array或者是cell的内容,但三者有什么具体区别呢?] []
- Android组件化框架设计与实践
在目前移动互联网时代,每个 APP 就是流量入口,与过去 PC Web 浏览器时代不同的是,APP 的体验与迭代速度影响着用户的粘性,这同时也对从事移动开发人员提出更高要求,进而移动端框架也层出不穷. ...
- [C#] 获取计算机内部信息 - ComputerInfoHelper
获取计算机内部信息 - ComputerInfoHelper 电脑有许多信息,如名称.CPU 和硬盘容量等,整理一个 Helper 来获取,下面目前只整理了一个方法,获取其它信息的方法类似. 一.代码 ...
- css选择器:nth-child()与:nth-of-type()的差异
:nth-child()和:nth-of-type()都是Css3中的伪类选择器,其作用相似却又不完全相同. 名词解释 :nth-child()选择器匹配其父元素的第n个子元素,不论元素类型. :nt ...
- JAVA设计模式---迭代器模式
1.定义: 提供一种方法顺序访问一个聚合对象中的各个元素,而又不暴露其内部的表示. 2.实例:1)需求: 菜单(煎饼屋菜单.餐厅菜单和咖啡菜单)采用不同的集合存取(ArrayList,String[] ...
- 济南清北学堂游记 Day 2.
在大佬云集的地方被直线碾压是什么样的体验? 大概就是210和1030的差别. 大概就是高质量机械键盘和空气的区别. 回来的路上,我一直在想,我到底是不是一个高三的? 大概也是能找到以前在家和学校训练时 ...
- NOIP2016提高组初赛(C++语言)试题 个人的胡乱分析 Part 2.
洛谷秋令营day1模拟赛原地爆炸,心态崩了.于是打算写一下初赛题放松一下. 上次胡乱分析到了选择题,这次我想说说后面的题. 问题求解 T1.有一个1x8的方格图形,黑白两色填涂每个方格,两个黑格并不能 ...
- 用js实现2048小游戏
用js实现2048小游戏 笔记仓库:https://github.com/nnngu/LearningNotes 1.游戏简介 2048是一款休闲益智类的数字叠加小游戏.(文末给出源代码和演示地址) ...
- php实现301跳转
php实现301跳转代码 <?php Header("HTTP/1.1 301 Moved Permanently"); Header("Location: htt ...