UVa 11210 - Chinese Mahjong 模拟, 枚举 难度: 0
题目
https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=2151
题意
麻将,有13张牌,问再加哪一张牌可以凑成一对,若干个三张和若干个三联。
思路
如刘书思路,明显,这是一道模拟题。
感想
1. 三倍ice cream!
代码
#include <algorithm>
#include <cassert>
#include <cmath>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <queue>
#include <tuple>
#include <set>
#include <map>
#include <cassert>
#define LOCAL_DEBUG
using namespace std; string cardsName[] = {
"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 cards[14];
bool used[14];
int cardCaches[14];
int cnt[34]; bool read(map<string, int> cardsMap) {
memset(cnt, 0, sizeof cnt);
for (int i = 0; i < 13; i++) {
char tmp[6];
scanf("%s", tmp);
if (tmp[0] == '0')return false;
cards[i] = cardsMap[tmp];
cnt[cards[i]] ++;
}
return true;
} bool subcheck(int sid) {
if (sid > 13)return true;
if (used[sid])return subcheck(sid + 1);
int card = cardCaches[sid];
if (cnt[card] >= 3) {
used[sid] = used[sid + 1] = used[sid + 2] = true;
cnt[card] -= 3;
bool fl = subcheck(sid + 3);
cnt[card] += 3;
used[sid] = used[sid + 1] = used[sid + 2] = false;
if (fl)return true;
}
if (card < 27 && card % 9 < 7 && cnt[card] >0 && cnt[card + 1] > 0 && cnt[card + 2] > 0) {
int tmp[3] = { -1, -1, -1 };
for (int i = sid; i < 14; i++) {
if (used[i])continue;
int ind = cardCaches[i] - cardCaches[sid];
if (tmp[ind] == -1) {
tmp[ind] = i;
}
if (ind == 2)break;
}
for (int ind = 0; ind < 3; ind++) {
cnt[cardCaches[sid] + ind] --;
used[tmp[ind]] = true;
}
bool fl = subcheck(sid + 1);
for (int ind = 0; ind < 3; ind++) {
cnt[cardCaches[sid] + ind] ++;
used[tmp[ind]] = false;
}
if (fl)return true;
}
return false;
} bool check() {
memset(used, 0, sizeof used);
for (int i = 0; i < 14; i++) {
if (i && cardCaches[i] == cardCaches[i - 1])continue;
if (cnt[cardCaches[i]] >= 2) {
used[i] = used[i + 1] = true;
cnt[cardCaches[i]] -= 2;
bool fl = subcheck(0);
used[i] = used[i + 1] = false;
cnt[cardCaches[i]] += 2;
if(fl)return true;
}
}
return false;
} int main() {
#ifdef LOCAL_DEBUG
freopen("input.txt", "r", stdin);
//freopen("output2.txt", "w", stdout);
#endif // LOCAL_DEBUG map<string, int> cardsMap;
for (int i = 0; i < 34; i++) {
cardsMap[cardsName[i]] = i;
}
for (int ti = 1; read(cardsMap); ti++) {
string ans;
for (int i = 0; i < 34; i++) {
if (cnt[i] == 4)continue;
cards[13] = i;
cnt[i]++;
for (int j = 0; j < 14; j++)cardCaches[j] = cards[j];
sort(cardCaches, cardCaches + 14);
if (check()) {
ans += " ";
ans += cardsName[i];
}
cnt[i]--;
} if (ans.length() == 0) {
printf("Case %d: Not ready\n", ti);
}
else {
printf("Case %d:%s\n", ti, ans.c_str());
}
} return 0;
}
UVa 11210 - Chinese Mahjong 模拟, 枚举 难度: 0的更多相关文章
- 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
解题报告:麻将的规则这里就不说了,这题我们可以用暴力的方法,所以我们应该这样枚举,即将34张牌的每一张牌都放到原来的十三张牌里面去,所以这时我们只要判断这十四张牌能不能胡,因为若要胡的话一定要有一个对 ...
- UVa 10970 - Big Chocolate 水题 难度: 0
题目 https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&a ...
- UVa 11389 - The Bus Driver Problem 难度:0
题目 https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&a ...
- Uva LA 3902 - Network 树形DP 难度: 0
题目 https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=show_pr ...
- Uva 11520 - Fill the Square 贪心 难度: 0
题目 https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&a ...
- 快速切题 poj 2996 Help Me with the Game 棋盘 模拟 暴力 难度:0
Help Me with the Game Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 3510 Accepted: ...
- UVA 1508 - Equipment 状态压缩 枚举子集 dfs
UVA 1508 - Equipment 状态压缩 枚举子集 dfs ACM 题目地址:option=com_onlinejudge&Itemid=8&category=457& ...
随机推荐
- 哨兵查找法(明解c语言) + 函数式宏
//哨兵法,就是将待查找的元素加入待查找的数组的后面,这样可以提高性能(在数据量很庞大的时候体现出来) #include <stdio.h> #define FAILURE -1 //使用 ...
- 学习笔记4-pathon的range()函数和list()函数
使用python的人都知道range()函数很方便,今天再用到他的时候发现了很多以前看到过但是忘记的细节.这里记录一下range(),复习下list的slide,最后分析一个好玩儿的冒泡程序. 这里记 ...
- python实现邮件接口——smtplib模块
1. 思路 使用脚本发送邮件的思路其实和客户端发送邮件一样,过程都是: 登录 —> 写邮件 —> 发送 只不过通过脚本发送时我们需要考虑到整个过程的方方面面.以下为思路导图: 2. Pyt ...
- C# 递归缩小图片
需求:图片太大,上传到服务器会非常占用服务器空间,而系统又不要求高清图片,于是就通过递归的方式让图片每次减少10%的大小,当图片大小小于100k的时候就保存在本地,核心代码如下: class Prog ...
- (转)c# 互斥锁
----------------------------------------------文章1---------------------------------------------- 互斥锁( ...
- JavaScript 第二章总结
Writing real code 设计程序的步骤 First, a high-level design and a flowchart more details Working through th ...
- spring cloud: Hystrix(六):feign的注解@FeignClient:fallbackFactory(类似于断容器)与fallback方法
fallbackFactory(类似于断容器)与fallback方法 feign的注解@FeignClient:fallbackFactory与fallback方法不能同时使用,这个两个方法其实都类似 ...
- EntityFramework的安装
关于EntityFramework在vs2012无法引用的问题 这段时间学习MVC,发现一个问题,我公司的电脑可以直接引用EntityFrameWork这个命名空间,但我家里面的电脑就不能直接引用,刚 ...
- pytorch backward问题
pytorch中关于backward的很有意思的一个问题 <https://blog.csdn.net/shiheyingzhe/article/details/83054238> 但是我 ...
- ubuntu下常用命令
目录 一.查找命令 二.打开相应文件 三.查看系统资源占用 四.Ubantu解压文件 五.虚拟机ubuntu server 14.0 根目录扩容 七.ubuntu 关机,重启,注销命令 1 关机命令 ...