zoukankan      html  css  js  c++  java
  • 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 }
    代码君
  • 相关阅读:
    互联网秒杀设计
    生产者消费者模式实现
    Ping CAP CTO、Codis作者谈redis分布式解决方案和分布式KV存储
    VIM使用学习笔记 : 按键说明
    Cookie的有效访问路径
    简单的Cookie记录浏览记录案例
    认识Cookie和状态管理
    Java异常
    Java接口基础
    String常用方法
  • 原文地址:https://www.cnblogs.com/AOQNRMGYXLMV/p/4446771.html
Copyright © 2011-2022 走看看