题意:这个题意。有点麻烦,就是说给定13张牌,让你求能“听”的牌。(具体的见原题)

原题链接: https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=2151

析:看到这个题,真是麻烦啊,我又不懂麻将,看了好久才明白什么是“听”。分析一下思路。

首先对所有的牌都进行编号,然后暴力,首先的是先判断是哪个是将,然后再进一步判断,

哪一个是刻子,和顺子,用递归很简单的,只要全搜一下就好。整体不难,容易理解。

注意的是有的牌已经四张了,就不能再“听”了,这是一个坑。

代码如下:

  1. #include <cstdio>
  2. #include <iostream>
  3. #include <cstring>
  4. #include <algorithm>
  5. #include <cmath>
  6.  
  7. using namespace std;
  8. const int maxn = 15 + 5;
  9. const char *mahjong[] = {
  10. "1T", "2T", "3T", "4T", "5T", "6T", "7T", "8T", "9T",
  11. "1S", "2S", "3S", "4S", "5S", "6S", "7S", "8S", "9S",
  12. "1W", "2W", "3W", "4W", "5W", "6W", "7W", "8W", "9W",
  13. "DONG", "NAN", "XI", "BEI",
  14. "ZHONG", "FA", "BAI"
  15. };//打个麻将表
  16. int c[35], id[15];
  17. char s[100];
  18.  
  19. int getid(const char *s){//获得每张牌的id
  20. for(int i = 0; i < 34; ++i)
  21. if(!strcmp(mahjong[i], s)) return i;
  22.  
  23. return -1;
  24. }
  25.  
  26. bool dfs(int d){
  27. for(int i = 0; i < 34; ++i) if(c[i] > 2){//刻子
  28. if(3 == d) return true;//除了将,那么刻子和顺子的和应该是4个,所以这就已经判断安然无恙了
  29. c[i] -= 3;
  30. if(dfs(d+1)){ c[i] += 3; return true; }//找到时,要注意把c[i]改回来
  31. c[i] += 3;
  32. }
  33.  
  34. for(int i = 0; i < 24; ++i)
  35. if(i % 9 <= 6 && c[i] > 0 && c[i+1] > 0 && c[i+2] > 0) {//顺子
  36. if(3 == d) return true;//同上
  37. --c[i]; --c[i+1]; --c[i+2];
  38. if(dfs(d+1)){ ++c[i]; ++c[i+1]; ++c[i+2]; return true; }//同上
  39. ++c[i]; ++c[i+1]; ++c[i+2];
  40. }
  41.  
  42. return false;
  43. }
  44.  
  45. bool judge(){
  46. for(int i = 0; i < 34; ++i) if(c[i] > 1){//暴力,一张一张判断的,是不是将
  47. c[i] -= 2;//判断是将了
  48. if(dfs(0)){ c[i] += 2; return true; }//成立,要把c[i]改回来
  49. c[i] += 2;
  50. }
  51.  
  52. return false;//不成立
  53. }
  54.  
  55. int main(){
  56. // freopen("in.txt", "r", stdin);
  57. int kase = 0;
  58. bool ok;
  59. while(scanf("%s", s) == 1){
  60. if('0' == s[0]) break;
  61. id[0] = getid(s);
  62. for(int i = 1; i < 13; ++i){
  63. scanf("%s", s);
  64. id[i] = getid(s);//获得id
  65. // printf("%d %d\n", i, id[i]);
  66. }
  67. // printf("\n");
  68. ok = false;
  69.  
  70. memset(c, 0, sizeof(c));//每次要清空
  71. for(int i = 0; i < 13; ++i) ++c[id[i]];//获得每张牌的数量
  72.  
  73. // puts("++");
  74. printf("Case %d:", ++kase);
  75. for(int i = 0; i < 34; ++i){
  76. if(c[i] > 3) continue;//如果这张牌已经四张了,就不能再听了,是坑
  77.  
  78. ++c[i];
  79. if(judge()){
  80. ok = true;
  81. printf(" %s", mahjong[i]);//输出
  82. }
  83. --c[i];
  84. }
  85.  
  86. if(!ok) printf(" Not ready");
  87. printf("\n");
  88. }
  89. return 0;
  90. }

UVa 11210 Chinese Mahjong (暴力,递归寻找)的更多相关文章

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

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

  2. UVa 11210 - Chinese Mahjong

    解题报告:麻将的规则这里就不说了,这题我们可以用暴力的方法,所以我们应该这样枚举,即将34张牌的每一张牌都放到原来的十三张牌里面去,所以这时我们只要判断这十四张牌能不能胡,因为若要胡的话一定要有一个对 ...

  3. UVa 11210 - Chinese Mahjong 模拟, 枚举 难度: 0

    题目 https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&a ...

  4. 【LeetCode】300.最长递增子序列——暴力递归(O(n^3)),动态规划(O(n^2)),动态规划+二分法(O(nlogn))

    算法新手,刷力扣遇到这题,搞了半天终于搞懂了,来这记录一下,欢迎大家交流指点. 题目描述: 给你一个整数数组 nums ,找到其中最长严格递增子序列的长度. 子序列是由数组派生而来的序列,删除(或不删 ...

  5. UVA.12716 GCD XOR (暴力枚举 数论GCD)

    UVA.12716 GCD XOR (暴力枚举 数论GCD) 题意分析 题意比较简单,求[1,n]范围内的整数队a,b(a<=b)的个数,使得 gcd(a,b) = a XOR b. 前置技能 ...

  6. UVA.10305 Maximum Product (暴力)

    UVA.10305 Maximum Product (暴力) 题意分析 直接枚举起点和重点,然后算出来存到数组里面,sort然后取最大值即可. 代码总览 #include <iostream&g ...

  7. Idea 02.暴力递归与动态规划(1)

    1,关键词解释 1.1 暴力递归: 1, 把问题转化为规模缩小了的同类问题的子问题 2, 有明确的不需要继续进行递归的条件(base case) 3, 有当得到了子问题的结果之后的决策过程 4, 不记 ...

  8. Vue的 $parent,并不能准确找到上一层的控件,所以如果需要,需要填坑这个 bug,递归寻找下上级

    Vue的 $parent,并不能准确找到上一层的控件,所以如果需要,需要填坑这个 bug,递归寻找下上级 // Find components upward function findComponen ...

  9. uva 10710 - Chinese Shuffle(完美洗牌)

    option=com_onlinejudge&Itemid=8&category=474&page=show_problem&problem=1651"> ...

随机推荐

  1. Git revert merge

    从history1分出来的A, B两个branch A上有一些更改,例如 changeA2 changeA1 history1 B上有一些更改,例如 changeB2 changeB1 history ...

  2. Erlang/OTP:基于Behaviour的回调函数

    原始链接:https://blog.zhustec.me/posts/erlang-otp-1-callback-based-on-behaviour OTP 是什么 OTP 的全称是开源电信平台 ( ...

  3. 搭建turbine时 hystrix MaxConcurrentConnections reached 异常

    2017-03-28 10:04:47.438 ERROR 1035 --- [InstanceMonitor] c.n.t.monitor.instance.InstanceMonitor : Co ...

  4. 快快快!27个提升效率的iOS开源库推荐(转)

    CSDN移动将持续为您优选移动开发的精华内容,共同探讨移动开发的技术热点话题,涵盖移动应用.开发工具.移动游戏及引擎.智能硬件.物联网等方方面面.如果您想投稿.参与内容翻译工作,或寻求近匠报道,请发送 ...

  5. Linux启动提示Kernel panic - not syncing: Attempted to kill init解决办法

    系统类型:CentOS 6.5(x64) 启动提示:Kernel panic - not syncing: Attempted to kill init 解决办法: 系统启动的时候,按下‘e’键进入g ...

  6. 通过关闭 UseDNS和GSSAPIAuthentication选项加速 SSH登录

    通常情况下我们在连接 OpenSSH服务器的时候假如 UseDNS选项是打开的话,服务器会先根据客户端的 IP地址进行 DNS PTR反向查询出客户端的主机名,然后根据查询出的客户端主机名进行DNS正 ...

  7. Haskell语言学习笔记(23)MonadReader, Reader, ReaderT

    MonadReader 类型类 class Monad m => MonadReader r m | m -> r where ask :: m r ask = reader id loc ...

  8. Hibernate 中的锁( locking )

    业务逻辑的实现过程中,往往需要保证数据访问的排他性.如在金融系统的日终结算处理中,我们希望针对某个 cut-off 时间点的数据进行处理,而不希望在结算进行过程中(可能是几秒种,也可能是几个小时),数 ...

  9. Python中文件编码的检测

    前言: 文件打开的原则是“ 以什么编码格式保存的,就以什么编码格式打开 ”,我们常见的文件一般是以“ utf-8 ”或“ GBK ”编码进行保存的,由于编辑器一般设置了默认的保存和打开方式,所以我们在 ...

  10. 关于访问asp.net网站时登录后的奇怪问题

    登录后,地址栏地址变成了 http://www.XXXX.com/(F(HDc3otfFs0wkZu4P4CjZ50Qkck2q8aekR3g6F0m_NRZRo7kt7XQ6CjAFBR4PR8kZ ...