题目

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的更多相关文章

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

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

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

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

  3. UVa 11210 - Chinese Mahjong

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

  4. UVa 10970 - Big Chocolate 水题 难度: 0

    题目 https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&a ...

  5. UVa 11389 - The Bus Driver Problem 难度:0

    题目 https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&a ...

  6. Uva LA 3902 - Network 树形DP 难度: 0

    题目 https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=show_pr ...

  7. Uva 11520 - Fill the Square 贪心 难度: 0

    题目 https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&a ...

  8. 快速切题 poj 2996 Help Me with the Game 棋盘 模拟 暴力 难度:0

    Help Me with the Game Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 3510   Accepted:  ...

  9. UVA 1508 - Equipment 状态压缩 枚举子集 dfs

    UVA 1508 - Equipment 状态压缩 枚举子集 dfs ACM 题目地址:option=com_onlinejudge&Itemid=8&category=457& ...

随机推荐

  1. 力扣(LeetCode)976. 三角形的最大周长

    给定由一些正数(代表长度)组成的数组 A,返回由其中三个长度组成的.面积不为零的三角形的最大周长. 如果不能形成任何面积不为零的三角形,返回 0. 示例 1: 输入:[2,1,2] 输出:5 示例 2 ...

  2. 力扣(LeetCode) 136. 只出现一次的数字

    给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次.找出那个只出现了一次的元素. 说明: 你的算法应该具有线性时间复杂度. 你可以不使用额外空间来实现吗? 示例 1: 输入: [ ...

  3. php 建站 多域名配置 自定义重定向

    1. 申请一个域名 , 当多个域名使用. 比如 申请一个顶级域名为 .com 后缀的一级域名 :mine.com, 一般允许绑定四五个二级域名,比如 www.mine.com  . mine.mine ...

  4. ZOJ 3962 Seven Segment Display

    Seven Segment Display 思路: 经典数位dp 代码: #include<bits/stdc++.h> using namespace std; #define LL l ...

  5. IOException parsing XML document from class path resource [WebRoot/WEB-INF/applicationContext.xml];

    parsing XML document from class path resource [applicationContext.xml]; nested exception is java.io. ...

  6. HTML 第十三章总结

    前言 这一章的内容主要是处理 HTML 中的 tabular data,可以分为三个部分: 如何在 HTML 中创建表格 如何在 CSS 中 style 表格 如何在 CSS 中 style HTML ...

  7. ASA与N6K对接

    ASA5545配置interface GigabitEthernet0/0 channel-group 10 mode active no nameif no security-level no ip ...

  8. p1215

    一开始没用数组,没成功.后来确定用深搜后,用数组.出现一个不同的abc状态就记录下来,以免重复.一开始要倒的肯定是c杯,之后出现新状态要递归dfs3次.另外发现algorithm里的copy是原数组在 ...

  9. Canvas画板

    aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAA6QAAAGgCAIAAAAy0z21AAAgAElEQVR4nO3dfYwkZ30n8JqZfcNex8

  10. 结合canvas和jquery.Jcrop.js裁切图像上传图片

    1.引入的外部资源: jquery.Jcrop.css.jquery.Jcrop.js.upimg.js 2.使用的页面元素 @* 选择照片 *@ <div class="line&q ...