思路:得到输入得到mj[]的各个牌的数量,还差最后一张牌。直接暴力枚举34张牌就可以了。

   当假设得到最后一张牌,则得到了的牌看看是不是可以胡,如果可以胡的话,就假设正确。否者假设下一张牌。

   关键还是如何判断这组牌是不是可以胡。怎么判断呢?因为胡牌的条件是:nABC+mBBB+1DD, 而且n+m=4,其中n,m可以为0.

   下面是一张:递归DD的牌的递归情况:   

然后:依次是找顺子和刻子也是相同的算法

#include<iostream>
#include<cstring>
using namespace std;
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[], caseno, mj[];
char s[];
bool ok;
int consert(char *s){
for (int i = ; i < ;++i)
if (strcmp(mahjong[i], s) == )return i;
return -;
} bool Search(int dep){
for (int i = ; i < ; ++i) //判断顺子
if (c[i] >= ){
if (dep == )return true;
c[i] -= ;
if (Search(dep + ))return true;
c[i] += ;
}
for (int i = ; i < ;++i)
if (i % <= && c[i] >= && c[i + ] >= && c[i + ] >= ){
if (dep == )return true;
--c[i]; --c[i + ]; --c[i + ];
if (Search(dep + ))return true;
++c[i]; ++c[i + ]; ++c[i + ];
}
return false;
} bool check(){
for (int i = ; i < ;++i)
if (c[i] >= ){
c[i] -= ;
if(Search())return true; //开始搜索顺子和刻子
c[i] += ;
}
return false;
} int main(){
while (cin >> s){
if (s[] == '')break; ok = false;
//输入---------------------------
mj[] = consert(s);
for (int i = ; i < ; ++i)
{
cin >> s;
mj[i] = consert(s);
}
cout << "Case " << ++caseno << ":";
//开始暴力
for (int i = ; i < ; ++i){
memset(c, , sizeof(c));
for (int j = ; j < ; ++j)
c[mj[j]]++;
if (c[i] == )continue; //如果最后一张牌已经用光
c[i]++;
if (check()){ //判断可不可以胡牌
ok = true;
cout << " " << mahjong[i];
}
}
if (!ok)cout << " Not ready";
cout << endl;
}
return ;
}

Chinese Mahjong UVA - 11210 (暴力+回溯递归)的更多相关文章

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

    简单的回溯题 #include<iostream> #include<cstdio> #include<cstring> #include<algorithm ...

  2. Chinese Mahjong UVA - 11210 (DFS)

    先记录下每一种麻将出现的次数,然后枚举每一种可能得到的麻将,对于这个新的麻将牌,去判断可不可能胡,如果可以胡,就可以把这张牌输出出来. 因为eye只能有一张,所以这个是最好枚举的,就枚举每张牌成为ey ...

  3. uva 11210 Chinese Mahjong(暴力搜索)

    Chinese Mahjong Mahjong () is a game of Chinese origin usually played by four persons with tiles res ...

  4. #C++初学记录(N皇后#回溯递归)

    <font size=5 face"微软雅黑">N皇后Problem Description <font size=4 face"微软雅黑"& ...

  5. FZU 2107 Hua Rong Dao(暴力回溯)

    dfs暴力回溯,这个代码是我修改以后的,里面的go相当简洁,以前的暴力手打太麻烦,我也来点技术含量.. #include<iostream> #include<cstring> ...

  6. 2553 ACM N皇后 回溯递归

    题目:http://acm.hdu.edu.cn/showproblem.php?pid=2553 中文题目,题意很简单. 思路:听说这是学习递归的经典题目,就来试试,发现自己一点想法都没有,一遇到递 ...

  7. 再谈循环&迭代&回溯&递归&递推这些基本概念

    循环:不断重复进行某一运算.操作. 迭代:不断对前一旧值运算得到新值直到达到精度.一般用于得到近似目标值,反复循环同一运算式(函数),并且总是把前一 次运算结果反代会运算式进行下一次运算 递推:从初值 ...

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

    题意:这个题意.有点麻烦,就是说给定13张牌,让你求能“听”的牌.(具体的见原题) 原题链接: https://uva.onlinejudge.org/index.php?option=com_onl ...

  9. UVa 11210 - Chinese Mahjong

    解题报告:麻将的规则这里就不说了,这题我们可以用暴力的方法,所以我们应该这样枚举,即将34张牌的每一张牌都放到原来的十三张牌里面去,所以这时我们只要判断这十四张牌能不能胡,因为若要胡的话一定要有一个对 ...

随机推荐

  1. LeetCode算法题-Toeplitz Matrix(Java实现)

    这是悦乐书的第312次更新,第333篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第181题(顺位题号是766).如果从左上角到右下角的每个对角线具有相同的元素,则矩阵是 ...

  2. 微信小程序 base64 图片 canvas 画布 drawImage 实现

    在微信小程序中 canvas drawImage API 传入的第一个参数是 imageResource 图片资源路径,这个参数通常由从相册选择图片 wx.chooseImage 或 wx.getIm ...

  3. Linux 桌面玩家指南:14. 数值计算和符号计算

    特别说明:要在我的随笔后写评论的小伙伴们请注意了,我的博客开启了 MathJax 数学公式支持,MathJax 使用$标记数学公式的开始和结束.如果某条评论中出现了两个$,MathJax 会将两个$之 ...

  4. Linux 桌面玩家指南:04. Linux 桌面系统字体配置要略

    特别说明:要在我的随笔后写评论的小伙伴们请注意了,我的博客开启了 MathJax 数学公式支持,MathJax 使用$标记数学公式的开始和结束.如果某条评论中出现了两个$,MathJax 会将两个$之 ...

  5. Dom4J配合XPath解析schema约束的xml配置文件问题

    如果一个xml文件没有引入约束,或者引入的是DTD约束时,那么使用dom4j和xpath是可以正常解析的,不引入约束的情况本文不再展示. 引入DTD约束的情况 mybook.dtd: <?xml ...

  6. PHP——isset和empty

    前言 对于这两个PHP函数大家肯定都很熟悉,但是其二者的区别又有那些呢? 对比 isset  | 检测变量是否被设置过 1. 变量不存在,返回FALSE 2. 变量存在且其值为NULL,返回FALSE ...

  7. 【Linux篇】--awk的使用

    一.前述 awk是一个强大的文本分析工具.相对于grep的查找,sed的编辑,awk在其对数据分析并生成报告时,显得尤为强大.简单来说awk就是把文件逐行的读入,(空格,制表符)为默认分隔符将每行切片 ...

  8. .NET Core中的一个接口多种实现的依赖注入与动态选择看这篇就够了

    最近有个需求就是一个抽象仓储层接口方法需要SqlServer以及Oracle两种实现方式,为了灵活我在依赖注入的时候把这两种实现都给注入进了依赖注入容器中,但是在服务调用的时候总是获取到最后注入的那个 ...

  9. .NET西安社区 [拥抱开源,又见 .NET] 第二次活动简报

    「拥抱开源, 又见 .NET」 随着 .NET Core的发布和开源,.NET又重新回到人们的视野. .NET Core的下个3.0即将release,加入非常多的新功能,越来越拥抱变化,DevOps ...

  10. C#语法——消息,MVVM的核心技术。

    在C#中消息有两个指向,一个指向Message,一个指向INotify.这里主要讲INotify. INotify也有人称之为[通知],不管叫消息还是通知,都是一个意思,就是传递信息. 消息的定义 I ...