UVA 11210 中国麻将

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

http://7xjob4.com1.z0.glb.clouddn.com/f1186ae9a93d903ab533e5fce524bac6

题意:给你一副手牌,输出这手牌所有的听牌

思路:枚举所有34种牌,依次判断是否听这牌,先枚举选出将,再枚举顺子、刻子等,递归判断。

  1 #include <bits/stdc++.h>
  2 using namespace std;
  3 
  4 const char *mahjong[]={
  5 "0",
  6 "1T","2T","3T","4T","5T","6T","7T","8T","9T",
  7 "1S","2S","3S","4S","5S","6S","7S","8S","9S",
  8 "1W","2W","3W","4W","5W","6W","7W","8W","9W",
  9 "DONG","NAN","XI","BEI",
 10 "ZHONG","FA","BAI",
 11 };
 12 
 13 int n;
 14 int mj[15],c[35];
 15 
 16 int mjid(char str[])
 17 {
 18     int i,j;
 19     for(i=1;i<=34;i++)
 20     {
 21         if(strcmp(mahjong[i],str)==0)
 22         {
 23             return i;
 24         }
 25     }
 26 }
 27 
 28 int Search(int m)
 29 {
 30     int i,j;
 31     for(i=1;i<=34;i++)
 32     {
 33         if(c[i]>=3)
 34         {
 35             if(m==4)    return 1;
 36             c[i]-=3;
 37             if(Search(m+1)==1)  return 1;
 38             c[i]+=3;
 39         }
 40     }
 41     for(i=1;i<=25;i++)
 42     {
 43         if(i%9<=7 && i%9!=0 && c[i]>=1 && c[i+1]>=1 && c[i+2]>=1)
 44         {
 45             if(m==4)    return 1;
 46             c[i]--,c[i+1]--,c[i+2]--;
 47             if(Search(m+1)==1)  return 1;
 48             c[i]++,c[i+1]++,c[i+2]++;
 49         }
 50     }
 51     return 0;
 52 }
 53 
 54 int hu()
 55 {
 56     int i,j;
 57     for(i=1;i<=34;i++)
 58     {
 59         if(c[i]>=2)
 60         {
 61             c[i]-=2;
 62             if(Search(1)==1)
 63                 return 1;
 64             c[i]+=2;
 65         }
 66     }
 67     return 0;
 68 }
 69 int main()
 70 {
 71     int i,j;
 72     char str[10];
 73     int cas=1;
 74     while(scanf("%s",str)!=EOF)
 75     {
 76         if(str[0]=='0')
 77             break;
 78 
 79         mj[1]=mjid(str);
 80         for(i=2;i<=13;i++)
 81         {
 82             scanf("%s",str);
 83             mj[i]=mjid(str);
 84         }
 85 
 86         printf("Case %d:",cas++);
 87 
 88         bool flg=false;
 89         for(i=1;i<=34;i++)
 90         {
 91             memset(c,0,sizeof(c));
 92             for(j=1;j<=13;j++)
 93                 c[mj[j]]++;
 94             if(c[i]>=4)  continue;
 95 
 96             c[i]++;
 97             if(hu()==1)
 98             {
 99                 flg=true;
100                 printf(" %s",mahjong[i]);
101             }
102             c[i]--;
103         }
104 
105         if(!flg)
106             printf(" Not ready");
107         printf("
");
108     }
109     return 0;
110 }
View Code
原文地址:https://www.cnblogs.com/cyd308/p/5644788.html