UVa 11210 (DFS) Chinese Mahjong

大白书第一章的例题,当时看起来很吃力,现如今A这道题的话怎么写都无所谓了。

思路很简单,就是枚举胡哪张牌,然后枚举一下将牌,剩下如果能找到4个顺子或者刻子就胡了。

由于粗心,34个字符串初始化写错,各种WA。

 1 #include <cstdio>
 2 #include <cstring>
 3 #include <string>
 4 #include <iostream>
 5 using namespace std;
 6 
 7 int a[13], c[34];
 8 string s;
 9 
10 string mahjong[34] = { "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", "ZHONG", "FA", "BAI" };
14 
15 int ID(string& maj)
16 {
17     for(int i = 0; i < 34; i++)
18         if(mahjong[i] == maj) return i;
19     return -1;
20 }
21 
22 bool dfs(int d)
23 {
24     if(d == 4) return true;
25     for(int i = 0; i < 34; i++) if(c[i] >= 3)
26     {
27         c[i] -= 3;
28         if(dfs(d + 1)) return true;
29         c[i] += 3;
30     }
31     for(int i = 0; i <= 24; i++) if(i % 9 <= 6 && c[i] && c[i + 1] && c[i + 2])
32     {
33         c[i] -= 1; c[i + 1] -= 1; c[i + 2] -= 1;
34         if(dfs(d + 1)) return true;
35         c[i] += 1; c[i + 1] += 1; c[i + 2] += 1;
36     }
37     return false;
38 }
39 
40 bool check()
41 {
42     for(int i = 0; i < 34; i++) if(c[i] >= 2)
43     {
44         c[i] -= 2;
45         if(dfs(0)) return true;
46         c[i] += 2;
47     }
48     return false;
49 }
50 
51 int main()
52 {
53     freopen("in.txt", "r", stdin);
54 
55     int kase = 0;
56     while(cin >> s)
57     {
58         if(s[0] == '0') break;
59         printf("Case %d:", ++kase);
60 
61         a[0] = ID(s);
62         for(int i = 1; i <= 12; i++) { cin >> s; a[i] = ID(s); }
63 
64         bool ok = false;
65         for(int i = 0; i < 34; i++)
66         {
67             memset(c, 0, sizeof(c));
68             for(int j = 0; j < 13; j++) c[a[j]]++;
69             if(c[i] >= 4) continue;
70             c[i]++;
71             if(check())
72             {
73                 ok = true;
74                 printf(" %s", mahjong[i].c_str());
75             }
76         }
77         if(!ok) printf(" Not ready");
78         printf("\n");
79     }
80 
81     return 0;
82 }
代码君

 

posted @ 2015-04-22 10:56  AOQNRMGYXLMV  阅读(195)  评论(0编辑  收藏  举报