UVa 11210 - Chinese Mahjong
解题报告:麻将的规则这里就不说了,这题我们可以用暴力的方法,所以我们应该这样枚举,即将34张牌的每一张牌都放到原来的十三张牌里面去,所以这时我们只要判断这十四张牌能不能胡,因为若要胡的话一定要有一个对子,所以这个时候我们应该枚举到底用哪一种牌作为对子,不过还要先判断这种牌的数量是不是大于2,如果大于2说明这种牌可以作为对子。接下来就是判断这十四张牌到底能不能胡的问题。对于这个问题我们可以先把输入的字符串先转化成0到33的对应的数字模式,即0对应1T,1对应2T ...... 33对应BAI,这样我们可以从数字最小的牌开始判断,从0开始,然后分为以下几种情况,第一,这种牌的数量为0,做法是直接跳到下一种牌;第二,这种牌的数量大于等于3,做法是把这种牌作为刻子;第三,这种牌的数量小于3且大于0,这时我们判断从这张牌开始的三张牌以内,这三种牌的数量是否都是大于等于1,如果是,我们就将这三张牌作为顺子,然后把这三种牌的数量分别减少1。如果这三种情况都不满足,直接返回不可以胡。
#include<cstdio>
#include<cstring>
const char feng[][]={"","DONG","NAN","XI","BEI","ZHONG","FA","BAI"};
const char hua[][]={"T","S","W"};
int mj[];
int judge(char *p) {
if(p[]>=''&&p[]<='') {
if(p[]=='T')
return (p[]-''-);
else if(p[]=='S')
return (+p[]-'');
else return (+p[]-'');
}
else {
for(int i=;i<=;++i)
if(!strcmp(feng[i],p))
return (+i);
}
} bool search(int dep) {
int i;
for(i=;i<;++i)
if(mj[i]>=) {
if(dep==) return true;
mj[i]-=;
if(search(dep+)) return true;
mj[i]+=;
}
for(i=;i<=;++i)
if(i%<=&&mj[i]>=&&mj[i+]>=&&mj[i+]>=) {
if(dep==) return true;
mj[i]--; mj[i+]--;mj[i+]--;
if(search(dep+)) return true;
mj[i]++; mj[i+]++; mj[i+]++;
}
return false;
} bool check() {
for(int i=;i<;++i)
if(mj[i]>=) {
mj[i]-=;
if(search()) return true;
mj[i]+=;
}
return false;
}
int main() {
char str[];
int majiang[],Case=;
while(scanf("%s",str)&&str[]!='') {
majiang[]=judge(str);
int flag=;
printf("Case %d:",Case++);
for(int i = ; i<;++i) {
scanf("%s",str);
majiang[i+]=judge(str);
}
for(int i=;i<;++i) {
memset(mj,,sizeof(mj));
for(int j=;j<;++j)
mj[majiang[j]]++;
if(mj[i]>=)
continue;
mj[i]++;
if(check()) {
flag=;
if(i>=&&i<=)
printf(" %d%s",(i%+),hua[i/]);
else printf(" %s",feng[i-]);
}
}
if(!flag)
printf(" Not ready");
printf("\n");
}
return ;
}
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 (暴力,递归寻找)
题意:这个题意.有点麻烦,就是说给定13张牌,让你求能“听”的牌.(具体的见原题) 原题链接: https://uva.onlinejudge.org/index.php?option=com_onl ...
- UVa 11210 - Chinese Mahjong 模拟, 枚举 难度: 0
题目 https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&a ...
- uva 10710 - Chinese Shuffle(完美洗牌)
option=com_onlinejudge&Itemid=8&category=474&page=show_problem&problem=1651"> ...
- UVa 11210 (DFS) Chinese Mahjong
大白书第一章的例题,当时看起来很吃力,现如今A这道题的话怎么写都无所谓了. 思路很简单,就是枚举胡哪张牌,然后枚举一下将牌,剩下如果能找到4个顺子或者刻子就胡了. 由于粗心,34个字符串初始化写错,各 ...
- Chinese Mahjong UVA - 11210 (暴力+回溯递归)
思路:得到输入得到mj[]的各个牌的数量,还差最后一张牌.直接暴力枚举34张牌就可以了. 当假设得到最后一张牌,则得到了的牌看看是不是可以胡,如果可以胡的话,就假设正确.否者假设下一张牌. 关键还是如 ...
- Chinese Mahjong UVA - 11210 (DFS)
先记录下每一种麻将出现的次数,然后枚举每一种可能得到的麻将,对于这个新的麻将牌,去判断可不可能胡,如果可以胡,就可以把这张牌输出出来. 因为eye只能有一张,所以这个是最好枚举的,就枚举每张牌成为ey ...
- UVa中国麻将(Chinese Mahjong,Uva 11210)
简单的回溯题 #include<iostream> #include<cstdio> #include<cstring> #include<algorithm ...
- UVA 11210 中国麻将
https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...
随机推荐
- PHP+微信分享自定义小图标
微信分享以后的小图标如下图: <script>document.addEventListener('WeixinJSBridgeReady', function onBridgeReady ...
- javascript继承(三)—继承的实现原理
打算针对js的继承写一系列文章,详细的分析js里继承原理,实现方式,各种继承方式的优缺点,以及最优继承方案,还有多继承的问题等…. 面向对象的编程的核心是封装.继承和多态,js可以看作是一种面向对象的 ...
- Flex ObjectHandles 构建绘图程序!
模型 主画布组件:com/components/graph/GraphContainer.mxml <?xml version="1.0" encoding="ut ...
- 阿里百川IMSDK--自定义群聊界面
// 获取群对象 YWTribe *tribe = [self.tribesArray objectAtIndex:indexPath.row]; // 发起群聊 UIViewController * ...
- Easyui使用记录
一天就这搞了这几行. 1. if else 可以嵌套: 2. 子页面调用父页面js,需要使用top.父页面js的方法. <script type="text/javascript&qu ...
- java文件中文在MyEclipse中打开变成了乱码
导入其他人的项目,出现乱码状况 以下是解决方案之一:
- PHP ADLogin
<?php $user = 'aaaa'; $password = 'xxxx'; $domain = 'b.a.com'; //设定域名 $port = 3268; $basedn = 'dc ...
- zoj3890 BFS
就是搜. #include<stdio.h> #include<string.h> #include<queue> using namespace std; #de ...
- 40.Android之新手指引界面学习
我们经常可以看到打开新App会有新手指引界面,类似蒙板效果今天来学习.原理其实很简单,设置一个透明Activity或者Dialog,然后修改其属性即可.由于实现比较简单,就贴一部分代码. 1.在And ...
- Opencv加载和显示图片
#include <opencv2/core/core.hpp> #include <opencv2/highgui/highgui.hpp> #include <ios ...