码迷,mamicode.com
首页 > 其他好文 > 详细

UVa 11210 (DFS) Chinese Mahjong

时间:2015-04-22 12:59:21      阅读:92      评论:0      收藏:0      [点我收藏+]

标签:

大白书第一章的例题,当时看起来很吃力,现如今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 }
代码君

 

UVa 11210 (DFS) Chinese Mahjong

标签:

原文地址:http://www.cnblogs.com/AOQNRMGYXLMV/p/4446771.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!