hdu4431 Mahjong
来源:互联网 发布:软件到期时间破解 编辑:程序博客网 时间:2024/06/08 17:19
这道题直接考虑胡什么不太好实现,所以直接枚举34张牌,看是否能够凑成胡牌
这里需要注意一点,任意一种牌,数量不能超过四张
当时写完之后一直超时,尝试优化都失败了
其实,枚举完奖牌之后,dfs过程中若一张牌有,但是不能形成刻子或者顺子,那么这张牌肯定没有用 那么直接返回就好了,这是一个重要的优化
加了这个优化之后就可以过了
不过后来还是直接模拟做了,时间更快,也更好写
先直接枚举顺子,不过要注意,一张牌若是三张(枚举将牌之后),就不能拆成顺子
然后统计是否牌都用过即可
具体见代码吧,顺便贴上几组数据
//HEAD#include <cstdio>#include <ctime>#include <cstdlib>#include <cstring>#include <queue>#include <string>#include <set>#include <stack>#include <map>#include <cmath>#include <vector>#include <iostream>#include <algorithm>using namespace std;//LOOP#define FF(i, a, b) for(int i = (a); i < (b); ++i)#define FE(i, a, b) for(int i = (a); i <= (b); ++i)#define FED(i, b, a) for(int i = (b); i>= (a); --i)#define REP(i, N) for(int i = 0; i < (N); ++i)#define CLR(A,value) memset(A,value,sizeof(A))#define CPY(a, b) memcpy(a, b, sizeof(a))//STL#define SZ(V) (int)V.size()#define PB push_back#define EQ(a, b) (fabs((a) - (b)) <= 1e-10)#define ALL(c) (c).begin(), (c).end()//INPUT#define RI(n) scanf("%d", &n)#define RII(n, m) scanf("%d%d", &n, &m)#define RIII(n, m, k) scanf("%d%d%d", &n, &m, &k)#define RS(s) scanf("%s", s)//OUTPUT#define WI(n) printf("%d\n", n)typedef long long LL;typedef vector <int> VI;const int INF = 100000000;const double eps = 1e-10;const int MAXN = 440;const char* mah[] = {"1m", "2m", "3m", "4m", "5m", "6m", "7m", "8m", "9m", "1s", "2s", "3s", "4s", "5s", "6s", "7s", "8s", "9s", "1p", "2p", "3p", "4p", "5p", "6p", "7p", "8p", "9p", "1c", "2c", "3c", "4c", "5c", "6c", "7c"};int mine[20], t[40], tt[40];bool ans[40];int get(char* s){ REP(i, 34) if (!strcmp(mah[i], s)) return i;}bool solve(){ memcpy(tt, t, sizeof(t)); int ret = 0; REP(i, 25) if (i % 9 <= 6 && tt[i] && tt[i] != 3 && tt[i + 1] && tt[i + 2]) { ret += 3; tt[i]--, tt[i+ 1]--, tt[i + 2]--; i--; } REP(i, 34) if (tt[i] == 3) { ret += 3; tt[i] -= 3; } if (ret == 12) return 1; return 0;}bool dfs1(){ REP(i, 34) if (t[i] >= 2) { t[i] -= 2; if (solve()) return 1; t[i] += 2; } return 0;}bool seven(){ int ret = 0; REP(i, 34) if (t[i] == 2) ret++; if (ret == 7) return 1; return 0;}bool dasixi(){ int ret = 0; if (t[0]) ret += t[0]; else return 0; if (t[8]) ret += t[8]; else return 0; if (t[9]) ret += t[9]; else return 0; if (t[17]) ret += t[17]; else return 0; if (t[18]) ret += t[18]; else return 0; if (t[26]) ret += t[26]; else return 0; FF(i, 27, 34) { if (t[i]) ret += t[i]; else return 0; } if (ret == 14) return 1; return 0;}int main(){ int T; char s[20]; RI(T); while (T--) { CLR(ans, 0); int ok = 0; REP(i, 13) { RS(s); mine[i] = get(s); } CLR(t, 0); REP(j, 13) t[mine[j]]++; REP(i, 34) if (t[i] > 4) ok = -1; if (ok != -1) { REP(i, 34) { CLR(t, 0); REP(j, 13) t[mine[j]]++; if (t[i] >= 4) continue; t[i]++; if (seven() || dasixi() || dfs1()) { ans[i] = 1; ok++; } t[i]--; } } if (ok > 0) { printf("%d", ok); REP(i, 34) if (ans[i]) printf(" %s", mah[i]); puts(""); } else puts("Nooten"); }}/*201p 2p 3p 7p 8p 9p 1s 2s 3s 1c 1c 2c 2c1p 2p 3p 3p 3p 3p 4p 5p 1m 2m 3m 4m 5m1s 2s 3s 2c 2c 2c 2p 3p 5m 6m 7m 1p 1p1p 1p 2p 3p 4s 5s 6s 7c 7c 3s 3s 2m 2m1p 1p 1p 2p 2p 3p 3p 4p 4p 5p 6p 7p 8p1p 2p 3p 3p 3p 4p 5p 1m 2m 3m 4m 5m 6m1p 2p 3p 3p 3p 3p 4p 5p 1m 2m 3m 4m 5m1p 2p 3p 3p 3p 3p 4p 5p 6p 1m 2m 3m 4m1c 2c 3c 4c 5c 6c 7c 1p 9p 1m 9m 1s 9s1p 1p 3p 2p 5p 2p 6p 7p 3p 4p 5p 6p 4p1p 1p 2p 3p 2p 3p 4p 4p 5p 5p 6p 7p 7p1p 1p 9p 9p 1m 1m 9m 9m 1s 9s 1s 9s 7c1p 1p 1p 1p 1m 1m 1m 1s 9s 1c 1c 1s 9s1p 1p 1s 9s 1m 9m 1c 2c 3c 4c 5c 6c 7c2 1c 2c2 3m 6m2 1p 4pNooten6 2p 3p 5p 6p 8p 9p2 3p 6p2 3m 6m2 1m 4m13 1m 9m 1s 9s 1p 9p 1c 2c 3c 4c 5c 6c 7c3 1p 4p 7p2 3p 6p1 7cNooten1 9p*/
- HDU4431 Mahjong
- hdu4431 Mahjong
- hdu4431 Mahjong
- [HDU4431][TJ01A]Mahjong
- hdu4431 Mahjong 枚举搜索。。
- HDU4431
- Mahjong
- hdu4431 枚举+模拟
- hdu4431麻将模拟
- Chinese Mahjong
- A. Mahjong
- HDOJ4431 Mahjong
- uva11210Chinese Mahjong
- Chinese Mahjong
- Chinese Mahjong
- Chinese Mahjong
- Mahjong Tales: Ancient Wisdom
- Mahjong HDU 4431
- GNURadio教程链接汇总
- bezier
- ubuntu 12.04 64位 adobe plugin creates junk debug files: 'C:\\nppdf32Log\\debuglog.txt'
- 正则表达式基础
- 计数排序
- hdu4431 Mahjong
- 重构
- 在MFC中,运用轨迹球算法实现鼠标旋转物体
- 编程中位运算用法总结
- 冒泡排序(工程中很少使用,时间复杂度太差了),linux纯C实现
- 开灯问题
- 如何在一个窗体中调用另一个窗体的控件或方法
- 【学习笔记】 关于 Set 和 Multiset
- java学习