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 }

代码君

时间: 2024-10-13 00:22:47

UVa 11210 (DFS) Chinese Mahjong的相关文章

uva 11210 Chinese Mahjong(暴力枚举)

uva 11210 Chinese Mahjong Mahjong () is a game of Chinese origin usually played by four persons with tiles resembling dominoes and bearing various designs, which are drawn and discarded until one player wins with a hand of four combinations of three

11210 - Chinese Mahjong(dfs)

题目:11210 - Chinese Mahjong 题目大意:给出十三个麻将, 问再取哪一个能胡?把所有的情况列出来,并且按照题目要求的顺序.胡的条件需要一个而且仅一个对,然后剩下要么是三个相同的,要么是三个连续的(前提是后缀相同,并且只有 T, S, W在考虑范围内) 解题思路:把要取的情况一个个枚举出来,然后dfs, 找是否加入这个可以胡就可以了,找的话就三种情况去判断一下.但是要注意:三个连续要注意需要后缀相同,我这里是把麻将转成数字,然后统计这个麻将出现的次数,所以需要些边界的判断.

UVa 11210 Chinese Mahjong (暴力,递归寻找)

题意:这个题意.有点麻烦,就是说给定13张牌,让你求能“听”的牌.(具体的见原题) 原题链接: https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=2151 析:看到这个题,真是麻烦啊,我又不懂麻将,看了好久才明白什么是“听”.分析一下思路. 首先对所有的牌都进行编号,然后暴力,首先的是先判断是哪个是将,然后再进一步判断, 哪一个是刻子,和顺子

UVA 11210 Chinese Mahjong

#include <map> #include <set> #include <list> #include <cmath> #include <ctime> #include <deque> #include <stack> #include <queue> #include <cctype> #include <cstdio> #include <string> #inc

UVA 11210 Chinese Mahjong(中国麻将 , 大模拟)

解题思路: 关键在于如何判断十四张牌能否和牌,这里采用dfs来判断,详情看代码. #include <iostream> #include <cstring> #include <cstdlib> #include <cstdio> #include <algorithm> #include <vector> #include <queue> #include <set> #include <map>

UVa中国麻将(Chinese Mahjong,Uva 11210)

简单的回溯题 1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<algorithm> 5 using namespace std; 6 7 char *mahjong[]={ 8 "1T","2T","3T","4T","5T","6T","

UVA 11210 中国麻将

https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=2151 http://7xjob4.com1.z0.glb.clouddn.com/f1186ae9a93d903ab533e5fce524bac6 题意:给你一副手牌,输出这手牌所有的听牌 思路:枚举所有34种牌,依次判断是否听这牌,先枚举选出将,再枚举顺子.刻子等,递归判断. 1 #in

uva 818(dfs+图+状态压缩)

题意:有n个环,编号从1到n,给出了一些环环相扣的情况,比如给a和b表示a和b两个环的扣在一起的,每个环都是可以打开的,问最少打开多少个环,然后再扣好,可以让所有的环成为一条链. 题解:状态压缩把所有的打开环的情况枚举出来,然后拿去判断是否成立,更新打开环后的图g[i][j],和每个点的度数,不成立有三种情况,1.计算没有打开的环的度数,如果大于2说明不会有链,2.把没有打开环拿去dfs,访问过就vis[i]++,如果vis[i]>=2说明存在环,3.如果打开的环数num + 1小于链的数量,说

UVA 11853 [dfs乱搞]

/* 大连热身E题 不要低头,不要放弃,不要气馁,不要慌张 题意: 在1000×1000的格子内有很多个炮弹中心,半径给定. 为某人能否从西部边界出发,从东部边界走出. 不能输出不能,能的话输出最北边的入口和出口的坐标. 思路: dfs乱搞题.把炮弹辐射范围连在一起的炮弹看作一个整体,记录下它围起来的边界区域. 然后找到最北边的输出. */ #include<bits/stdc++.h> using namespace std; double x[1005],y[1005],r[1005];