UVa 11210 Chinese Mahjong (暴力,递归寻找)
题意:这个题意。有点麻烦,就是说给定13张牌,让你求能“听”的牌。(具体的见原题)
原题链接: https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=2151
析:看到这个题,真是麻烦啊,我又不懂麻将,看了好久才明白什么是“听”。分析一下思路。
首先对所有的牌都进行编号,然后暴力,首先的是先判断是哪个是将,然后再进一步判断,
哪一个是刻子,和顺子,用递归很简单的,只要全搜一下就好。整体不难,容易理解。
注意的是有的牌已经四张了,就不能再“听”了,这是一个坑。
代码如下:
#include <cstdio>
#include <iostream>
#include <cstring>
#include <algorithm>
#include <cmath> using namespace std;
const int maxn = 15 + 5;
const char *mahjong[] = {
"1T", "2T", "3T", "4T", "5T", "6T", "7T", "8T", "9T",
"1S", "2S", "3S", "4S", "5S", "6S", "7S", "8S", "9S",
"1W", "2W", "3W", "4W", "5W", "6W", "7W", "8W", "9W",
"DONG", "NAN", "XI", "BEI",
"ZHONG", "FA", "BAI"
};//打个麻将表
int c[35], id[15];
char s[100]; int getid(const char *s){//获得每张牌的id
for(int i = 0; i < 34; ++i)
if(!strcmp(mahjong[i], s)) return i; return -1;
} bool dfs(int d){
for(int i = 0; i < 34; ++i) if(c[i] > 2){//刻子
if(3 == d) return true;//除了将,那么刻子和顺子的和应该是4个,所以这就已经判断安然无恙了
c[i] -= 3;
if(dfs(d+1)){ c[i] += 3; return true; }//找到时,要注意把c[i]改回来
c[i] += 3;
} for(int i = 0; i < 24; ++i)
if(i % 9 <= 6 && c[i] > 0 && c[i+1] > 0 && c[i+2] > 0) {//顺子
if(3 == d) return true;//同上
--c[i]; --c[i+1]; --c[i+2];
if(dfs(d+1)){ ++c[i]; ++c[i+1]; ++c[i+2]; return true; }//同上
++c[i]; ++c[i+1]; ++c[i+2];
} return false;
} bool judge(){
for(int i = 0; i < 34; ++i) if(c[i] > 1){//暴力,一张一张判断的,是不是将
c[i] -= 2;//判断是将了
if(dfs(0)){ c[i] += 2; return true; }//成立,要把c[i]改回来
c[i] += 2;
} return false;//不成立
} int main(){
// freopen("in.txt", "r", stdin);
int kase = 0;
bool ok;
while(scanf("%s", s) == 1){
if('0' == s[0]) break;
id[0] = getid(s);
for(int i = 1; i < 13; ++i){
scanf("%s", s);
id[i] = getid(s);//获得id
// printf("%d %d\n", i, id[i]);
}
// printf("\n");
ok = false; memset(c, 0, sizeof(c));//每次要清空
for(int i = 0; i < 13; ++i) ++c[id[i]];//获得每张牌的数量 // puts("++");
printf("Case %d:", ++kase);
for(int i = 0; i < 34; ++i){
if(c[i] > 3) continue;//如果这张牌已经四张了,就不能再听了,是坑 ++c[i];
if(judge()){
ok = true;
printf(" %s", mahjong[i]);//输出
}
--c[i];
} if(!ok) printf(" Not ready");
printf("\n");
}
return 0;
}
UVa 11210 Chinese Mahjong (暴力,递归寻找)的更多相关文章
- uva 11210 Chinese Mahjong(暴力搜索)
Chinese Mahjong Mahjong () is a game of Chinese origin usually played by four persons with tiles res ...
- UVa 11210 - Chinese Mahjong
解题报告:麻将的规则这里就不说了,这题我们可以用暴力的方法,所以我们应该这样枚举,即将34张牌的每一张牌都放到原来的十三张牌里面去,所以这时我们只要判断这十四张牌能不能胡,因为若要胡的话一定要有一个对 ...
- UVa 11210 - Chinese Mahjong 模拟, 枚举 难度: 0
题目 https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&a ...
- 【LeetCode】300.最长递增子序列——暴力递归(O(n^3)),动态规划(O(n^2)),动态规划+二分法(O(nlogn))
算法新手,刷力扣遇到这题,搞了半天终于搞懂了,来这记录一下,欢迎大家交流指点. 题目描述: 给你一个整数数组 nums ,找到其中最长严格递增子序列的长度. 子序列是由数组派生而来的序列,删除(或不删 ...
- UVA.12716 GCD XOR (暴力枚举 数论GCD)
UVA.12716 GCD XOR (暴力枚举 数论GCD) 题意分析 题意比较简单,求[1,n]范围内的整数队a,b(a<=b)的个数,使得 gcd(a,b) = a XOR b. 前置技能 ...
- UVA.10305 Maximum Product (暴力)
UVA.10305 Maximum Product (暴力) 题意分析 直接枚举起点和重点,然后算出来存到数组里面,sort然后取最大值即可. 代码总览 #include <iostream&g ...
- Idea 02.暴力递归与动态规划(1)
1,关键词解释 1.1 暴力递归: 1, 把问题转化为规模缩小了的同类问题的子问题 2, 有明确的不需要继续进行递归的条件(base case) 3, 有当得到了子问题的结果之后的决策过程 4, 不记 ...
- Vue的 $parent,并不能准确找到上一层的控件,所以如果需要,需要填坑这个 bug,递归寻找下上级
Vue的 $parent,并不能准确找到上一层的控件,所以如果需要,需要填坑这个 bug,递归寻找下上级 // Find components upward function findComponen ...
- uva 10710 - Chinese Shuffle(完美洗牌)
option=com_onlinejudge&Itemid=8&category=474&page=show_problem&problem=1651"> ...
随机推荐
- you boot volume has only 0 byte size
懒人方法: uname -a 列出目前使用的内核 dpkg -l | grep linux-image 列出存在的linux内核 sudo apt-get purge linux-image-3.16 ...
- java编写一个汽车类,有属性:品牌、型号、排量、速度,有方法:启动、加速、转弯、刹车、息火
/* * 汽车实体类 * 类里面有属性和方法 */public class Car { String brand; //汽车品牌 String modelNumber; //汽车型号 ...
- C++ 0x 使用condition_variable 与 Mutex 同步两个线程
Mutex : 锁 同一时间只允许一个线程访问其代码内容 拟人 : 就是一把锁而已,可以lock unlock, 谁都可以拿到锁,打开门进屋,但进去后,就会把门锁上(lock) 别人想进就得等他出 ...
- 常用类一一时间处理相关类一一java.util.Tomezone(java.util.Calendar , java.util.Date , java.text.DateFormat)
时间处理相关类 时间是一个一维的东东.所以,我们需要一把刻度尺来区表达和度量时间.在计算机世界,我们把1970 年 1 月 1 日 00:00:00定为基准时间,每个度量单位是毫秒(1秒的千分之一). ...
- EXCEL保存提示“隐私问题警告:此文档中包含宏……”解决办法
先点击“禁止宏运行”的那个按钮.打开文件后,按alt + F11 进入宏编辑器,在“工程”里查看是什么宏.如果是你需要的,就留着.否则右击这个宏名称,选择“移除”. 另外,如果是你需要的,还需要在 工 ...
- 表单input中disabled提交后得不到值的解决办
input 按钮的disabled属性,如果设置了,form表单提交后,后台接收不到input的value input的字段当为diabled时时无法获取数值得,所以最近不要用这个,我们可以用read ...
- dreamwave基础
WEBcs架构需要在客户段安装程序, 需要安装程序, 工作量会比较大, 需要安装和维护, 比如以后系统升级, 会很麻烦. 优点是一些业务逻辑可以在客户端, 可以减少服务器的一些压力, 客户端的界面操作 ...
- 前端基础之Bootstrap
1. 页面加载完之后才执行的JS代码 1. DOM方式 window.onload = function(){} 2. jQuery方式 ...
- 136. Single Number (Bit)
Given an array of integers, every element appears twice except for one. Find that single one. Note:Y ...
- 爬楼梯 · Climbing Stairs
[抄题]: 假设你正在爬楼梯,需要n步你才能到达顶部.但每次你只能爬一步或者两步,你能有多少种不同的方法爬到楼顶部? [思维问题]: 不知道一步.两步怎么加.还是用iteration迭代.此题公式可被 ...