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 }
代码君

 

你可能感兴趣的:(chinese)