• 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("
    ");
    79     }
    80 
    81     return 0;
    82 }
    代码君
  • 相关阅读:
    2019山东ACM省赛K题 zoj4123 Happy Equation
    2019山东ACM省赛总结
    ds
    CCPC2018 桂林 A: Array Merge(贪心、带权并查集合并)
    temp
    BZOJ 1013 球形空间产生器(高斯消元)
    BZOJ 2973 石头游戏(矩阵构造,矩阵快速幂)
    POJ 3233 Matrix Power Series (矩阵乘法,分块矩阵)
    每日bing API
    《音乐商店》第3集:模型规划
  • 原文地址:https://www.cnblogs.com/AOQNRMGYXLMV/p/4446771.html
Copyright © 2020-2023  润新知