HDU4431
来源:互联网 发布:源码天空 编辑:程序博客网 时间:2024/05/18 07:12
Problem : Mahjong
Source : 2012 Asia Tianjin Regional Contest
Description :
打麻将胡牌,现在给你十三张牌,问你能胡哪几张牌。
Solution :
模拟,可惜,当时做的时候用了
dfs ,然后就一直超时。这题其实很简单。我们首先要做的就是把牌组合一下,相同的放一起,然后一种一种判断。我们现在关注常规的判断(两张一样的牌,其余的要么是三张一样的,要么是三张连一起的)。我们枚举这34张牌,然后一张一张加进去。形成14张牌后,我们一定要枚举2张听牌。这很重要。然后如果出现三张一样的,那么就形成对子,如果这种牌还剩一张,那么不用说,肯定是要和后面的2中牌形成顺子。依次这样判断,最后就可以得出所有的答案了,具体看代码吧。很清楚。
Code(JAVA) :
import java.util.Scanner;public class Main { Scanner cin = new Scanner(System.in); final static int M = 35; final static String[] mahjong = new String[] { "", "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[] c = new int[M]; int getNum(String str) { for (int i = 0; i < mahjong.length; i++) if (mahjong[i].equals(str)) return i; return -1; } boolean d_1() { int tmp = 0; for (int i = 0; i < M; i++) tmp += (c[i] == 2 ? 1 : 0); return tmp == 7; } boolean d_2() { int[] array = new int[] { 1, 9, 10, 18, 19, 27, 28, 29, 30, 31, 32, 33, 34 }; int tmp1 = 0, tmp2 = 0; for (int i = 0; i < array.length; i++) if (c[array[i]] == 1) ++tmp1; else if (c[array[i]] == 2) ++tmp2; return tmp1 == 12 && tmp2 == 1; } boolean d_3() { for (int i = 1; i <= 34; i++) if (c[i] >= 2) { c[i] -= 2; if (d_4()) { c[i] += 2; return true; } c[i] += 2; } return false; } boolean d_4() { int[] tmp = new int[M]; for (int i = 0; i < c.length; i++) tmp[i] = c[i]; for (int i = 1; i <= 34; i++) { if (tmp[i] >= 3) tmp[i] -= 3; if (tmp[i] > 0 && (i >= 28 || (i - 1) % 9 >= 7)) return false; else if (tmp[i] > 0 && (tmp[i] > tmp[i + 1] || tmp[i] > tmp[i + 2])) return false; else if (tmp[i] > 0) { tmp[i + 1] -= tmp[i]; tmp[i + 2] -= tmp[i]; tmp[i] -= tmp[i]; } } return true; } public Main() { int T = cin.nextInt(); while (T-- > 0) { int[] que = new int[M]; int top = 0; String tmp = ""; for (int i = 0; i < c.length; i++) c[i] = 0; for (int i = 0; i < 13; i++) { tmp = cin.next(); ++c[getNum(tmp)]; } for (int i = 1; i < M; i++) { ++c[i]; if (c[i] > 4) { --c[i]; continue; } if (d_1() || d_2() || d_3()) que[top++] = i; --c[i]; } if (top == 0) System.out.println("Nooten"); else { System.out.print(top); for (int i = 0; i < top; i++) System.out.print(" " + mahjong[que[i]]); System.out.println(); } } } public static void main(String[] args) { new Main(); }}
0 0
- HDU4431
- HDU4431 Mahjong
- hdu4431 Mahjong
- hdu4431 Mahjong
- [HDU4431][TJ01A]Mahjong
- hdu4431 Mahjong 枚举搜索。。
- hdu4431 枚举+模拟
- hdu4431麻将模拟
- Android Studio(as)调试总结
- POJ 3087 (简单map + 模拟)
- SwiperrefreshLayout实现下拉刷新(demo)
- python学习笔记 --- 关于python的闭包
- RxJava操作符(4)-结合
- HDU4431
- 数据发送流程
- hdu 4081 次小生成树
- 开启分页机制———《x86汇编语言:从实模式到保护模式》读书笔记44
- Jmeter正则表达式提取器
- Deferred Shading
- C/C++何时使用引用和指针
- iOS Frame与Bound
- HDU 1247 字典树