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& ...
随机推荐
- 学习笔记2—MATLAB的copyfile技巧
clearclc %一.新建文件夹,%二.将原始路径下的数据剪切到新建文件夹中 path = ('E:\DFC_DMN_ASD_DATA_res\Cluster_hcc\4,6,8\Cluster_6 ...
- Qt网络应用开发初步
应用层的网络协议,如HTTP/FTP/SMTP等简称"应用协议",他们运行在TCP/UDP之上,从Qt5开始,已经不再分别提供QHttp类,QFtp类,应用层的编程使用QNet ...
- P493 brass
实现多态共有继承的两种方法 1 在派生类中重新定义基类的方法 2 使用虚方法 P493程序清单13.7使用的方法为在派生类中重新定义基类的方法 brass.h #ifndef BRASS_H #def ...
- ADO.NET梳理
目录: 简单的介绍下ADO.NET SqlConnection(连接对象) SqlCommand(命令对象) SqlParameter(Sql参数) SqlDataReader(数据流读取器) Sql ...
- 雷林鹏分享:jQuery EasyUI 表单 - 表单验证
jQuery EasyUI 表单 - 表单验证 本教程将向您展示如何验证一个表单.easyui 框架提供一个 validatebox 插件来验证一个表单.在本教程中,我们将创建一个联系表单,并应用 v ...
- Mycat入门核心概念
Mycat中的核心概念 Mycat中的核心概念 1.数据库中间件 Mycat 是一个开源的分布式数据库系统,但是由于真正的数据库需要存储引擎,而 Mycat 并没有 存储引擎,所以并 ...
- hdu-4632 Palindrome subsequence (回文子序列计数)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4632 问题要求回答一串字符串中回文子序列的数量,例如acbca就有 a,c,b,c,a,cc,aa,a ...
- test example
#coding=utf-8 import os import caffe import numpy as np root='/home/xxx/caffe/' #根目录 deploy=root + ' ...
- ubuntu+anaconda
1.下载anaconda 查看ubuntu是32位还是64位 命令: uname -m 如果显示i686,你安装了32位操作系统 如果显示 x86_64,你安装了64位操作系统 uname -a 查看 ...
- World Tour CodeForces - 667D (bfs最短路)
大意: 有向图, 求找4个不同的点ABCD, 使得d(A,B)+d(D,C)+d(C,A)最大