计蒜客 ACM训练联盟周赛 第一场 从零开始的神棍之路 暴力dfs
题目描述
ggwdwsbs最近被Zeratul和Kyurem拉入了日本麻将的坑。现在,ggwdwsbs有13张牌,Kyurem又打了一张,加起来有14张牌。ggwdwsbs想拜托你帮他判断一下,这14张牌能否和。
为了方便起见,本题不考虑字牌,即只有万,筒,条三种类型的牌,牌上带有数字1~9,相同的牌最多可能出现四次。
麻将想要和,必须把14张牌凑成指定的类型——七对子(2222222的形式)或四面子一雀头(23333的形式)。
其中,七对子是指14张牌恰好是7对相同的牌(每两对牌不得相同),如果凑出这样的牌,就可以直接和了;
四面子一雀头是指有一对相同的牌,且其他12张牌凑出四个“3”,这里的“3”可以是三个一样的牌(即刻子),也可以是数字连续且种类一样的三张牌(即顺子)。
在日本麻将中,把牌凑成第二种类型(“23333”)是不足以和牌的,还需要满足另一个条件——存在役。
下面介绍本题要求考虑的四种役。
1. 断幺九:14张牌里没有带数字1和数字9的牌出现。
2. 纯全带幺九:与第一种相反,这种类型要求,那一对相同牌和四个“3”中都要出现至少一张带数字1或9的牌。
3. 平和:四个“3”全部以顺子的形式出现。
4. 对对和:四个“3”全部以刻子的形式出现
满足上述四种中的一种,且满足“23333”的格式,也可以和牌。
请帮ggwdwsbs判断一下,他这14张牌能否和。
输入
第一行一个整数t,表示测试数据组数.
第二行到第t+1,每行有14个范围在1到27之间的整数,每个整数代表一张牌编号。
其中,编号1~9表示“万”的1~9,编号10~18表示“筒”的1~9,编号19~27表示“条”的1~9。
数据保证t≤100,每行的14张牌按编号从小到大给出。
输出
输出t行,每行一个整数,如果能和请输出1,不能和请输出0。
注:日麻的规则还有有很多本题所没有提及,如果你是一个日麻高手,请假装自己不知道那些规则以AC本题。
输出时每行末尾的多余空格,不影响答案正确性
样例输入
6
1 1 2 2 3 3 4 4 5 5 6 6 7 7
1 2 3 4 5 6 7 8 9 10 10 10 13 13
1 1 1 2 2 2 3 3 3 4 4 4 5 5
1 1 1 2 3 4 5 6 7 8 9 10 11 12
1 1 1 1 2 3 10 11 12 19 20 21 27 27
2 2 2 3 4 5 6 7 8 11 11 11 12 13
样例输出
1
0
1
1
1
1
题目来源
分析:比赛的时候用循环模拟的,结果模拟到心态爆炸,是有想过dfs,但是当时总是觉得循环差一点就出来了不想重新写dfs,于是循环模拟到了炸。。
比赛完后看完题解,和自己开始想的差不多,但是在处理23333的情况的时候,判断1,9和顺子还是刻字的时候优化了太多。。
接下来看代码把,解析写在代码里
#include <map>
#include <set>
#include <stack>
#include <cmath>
#include <queue>
#include <cstdio>
#include <vector>
#include <string>
#include <cstring>
#include <iostream>
#include <algorithm>
#define debug(a) cout << #a << " " << a << endl
using namespace std;
const int maxn = 1e4 + 10;
const int mod = 1e9 + 7;
typedef long long ll;
ll cnt1, cnt2, num, vis[30];
ll dfs( ll x ) {
if( x == 6 ) { //到6时,就是遍历到了最后一个3
if( num == 0 || num == 5 ) { //满足第一种或第二种情况
return 1;
}
if( cnt1 == 4 || cnt2 == 4 ) { //满足第三种或第四种情况
return 1;
}
return 0;
} else if( x == 1 ) {
for( ll i = 1; i <= 27; i ++ ) {
if( vis[i] >= 2 ) { //第一步先取出一个对子,一定要有对子才能继续接下来的步骤
vis[i] -= 2;
if( i%9 == 0 || i%9 == 1 ) { //有幺九就记录加上
num ++;
}
if( dfs(x+1) ) {
return 1;
}
if( i%9 == 0 || i%9 == 1 ) {
num --;
}
vis[i] += 2;
}
}
return 0;
} else {
for( ll i = 1; i <= 27; i ++ ) {
if( vis[i] >= 3 ) { //判断是否有刻子
vis[i] -= 3;
if( i%9 == 0 || i%9 == 1 ) {
num ++;
}
cnt1 ++;
if( dfs(x+1) ) {
return 1;
}
if( i%9 == 0 || i%9 == 1 ) {
num --;
}
cnt1 --;
vis[i] += 3;
}
if( i%9 != 0 && i%9 != 8 && vis[i] && vis[i+1] && vis[i+2] ) { //判断是否有顺子
vis[i] --, vis[i+1] --, vis[i+2] --;
if( i%9 == 7 || i%9 == 1 ) {
num ++;
}
cnt2 ++;
if( dfs(x+1) ) {
return 1;
}
cnt2 --;
if( i%9 == 7 || i%9 == 1 ) {
num --;
}
vis[i] ++, vis[i+1] ++, vis[i+2] ++;
}
}
return 0;
}
}
int main() {
ll t;
cin >> t;
while( t -- ) {
memset( vis, 0, sizeof(vis) );
cnt1 = cnt2 = num = 0;
for( ll i = 0; i < 14; i ++ ) {
ll x;
cin >> x;
vis[x] ++;
}
ll cnt = 0;
for( ll i = 1; i <= 27; i ++ ) {
if( vis[i] == 2 ) {
cnt ++;
}
}
if( cnt == 7 ) { //是否满足七个对子
cout << 1 << endl;
continue;
}
if( dfs(1) ) {
cout << 1 << endl;
} else {
cout << 0 << endl;
}
}
return 0;
}
计蒜客 ACM训练联盟周赛 第一场 从零开始的神棍之路 暴力dfs的更多相关文章
- 计蒜客 ACM训练联盟周赛 第一场 Christina式方格取数 思维
助手Christina发明了一种方格取数的新玩法:在n*m的方格棋盘里,每个格子里写一个数.两个人轮流给格子染色,直到所有格子都染了色.在所有格子染色完后,计算双方的分数.对于任意两个相邻(即有公共边 ...
- 计蒜客 ACM训练联盟周赛 第一场 Alice和Bob的Nim游戏 矩阵快速幂
题目描述 众所周知,Alice和Bob非常喜欢博弈,而且Alice永远是先手,Bob永远是后手. Alice和Bob面前有3堆石子,Alice和Bob每次轮流拿某堆石子中的若干个石子(不可以是0个), ...
- ACM训练联盟周赛(第一场)
B:Zeratul与Xor 题目描述 Xor(按位异或),对应C++中的“^”运算符. Zeratul给出了一个数列A[n](n≤105),要做q(q≤105)组动作,这些动作包括: 1 a:数列中 ...
- 计蒜客 28449.算个欧拉函数给大家助助兴-大数的因子个数 (HDU5649.DZY Loves Sorting) ( ACM训练联盟周赛 G)
ACM训练联盟周赛 这一场有几个数据结构的题,但是自己太菜,不会树套树,带插入的区间第K小-替罪羊套函数式线段树, 先立个flag,BZOJ3065: 带插入区间K小值 计蒜客 Zeratul与Xor ...
- 计蒜客 28437.Big brother said the calculation-线段树+二分-当前第k个位置的数 ( ACM训练联盟周赛 M)
M. Big brother said the calculation 通过线段树维护. 这个题和杭电的一道题几乎就是一样的题目.HDU5649.DZY Loves Sorting 题意就是一个n的排 ...
- 计蒜客 ACM竞赛高校联盟训练赛 第8场 煎牛排
水一水. https://nanti.jisuanke.com/t/24205 煎牛排 题目描述 又是一个难得的周六,是时候远离食堂和外卖出去大吃一顿了.圈内知名吃货AA正想着中午去吃汉堡炸鸡烤肉火锅 ...
- ACM训练联盟周赛 A. Teemo's bad day
65536K Today is a bad day. Teemo is scolded badly by his teacher because he didn't do his homework ...
- ACM训练联盟周赛 K. Teemo's reunited
Teemo likes to drink raspberry juice. He even spent some of his spare time tomake the raspberry jui ...
- ACM训练联盟周赛 Teemo's formula
Teemo has a formula and he want to calculate it quickly. The formula is . As the result may be very ...
随机推荐
- 华为matebook14vm虚拟机错误
1.创建时显示不支持64位虚拟机 测试环境: 华为matebook14 window10 专业工作站版 1903 问题描述: 创建虚拟机时显示:此主机不支持64位解决方案 问题参考: 参考1 ...
- 一道看似简单的go程序的深入分析
先上代码: func main() { var a [10]int for i := 0; i < 10; i++ { go func(i int) { for { a[i]++ } }(i) ...
- Java的自动装箱/拆箱
概述 自JDK1.5开始, 引入了自动装箱/拆箱这一语法糖, 它使程序员的代码变得更加简洁, 不再需要进行显式转换.基本类型与包装类型在某些操作符的作用下, 包装类型调用valueOf()方法将原始类 ...
- FTP服务端部署
FTP服务端搭建(本地用户登入:使用本地用户和密码登入)1.文件配置:vsftpd.conf: 主配置文件ftpusers: 指定哪些用户不能访问FTP服务器user_list: 指定的用户是否可以访 ...
- 图像反转(一些基本的灰度变换函数)基本原理及Python实现
1. 基本原理 获取像素值在[0, L]范围内的图像的反转图像,即为负片.适用于增强图像中白色或者灰色的区域,尤其当黑色在图片中占主地位时候 $$T(r) = L-r$$ 2. 运行结果 图源自ski ...
- 9.源码分析---SOFARPC是如何实现故障剔除的?
SOFARPC源码解析系列: 1. 源码分析---SOFARPC可扩展的机制SPI 2. 源码分析---SOFARPC客户端服务引用 3. 源码分析---SOFARPC客户端服务调用 4. 源码分析- ...
- python面试总结1(基础章节)
python语言基础 语言特点 python是静态还是动态类型?是强类型还是弱类型 动态强类型语言 动态还是静态指的是编译期还是运作期确定类型 强类型指的是不会发生隐式类型转换 python作为后端语 ...
- Leader-Follower线程模型简介
参考58沈剑大神架构师之路上的文章,谈谈Leader-Follower线程模型: 上图就是L/F多线程模型的状态变迁点,共6个关键点: (1)线程有3种状态:领导leading,处理processin ...
- [Spring cloud 一步步实现广告系统] 19. 监控Hystrix Dashboard
在之前的18次文章中,我们实现了广告系统的广告投放,广告检索业务功能,中间使用到了 服务发现Eureka,服务调用Feign,网关路由Zuul以及错误熔断Hystrix等Spring Cloud组件. ...
- 前端面试题集锦(二)之CSS部分
1.CSS中的选择器都有哪些?权限情况如何? 解答: (1)类选择器 .className (2) ID选择器 #id (3) 元素选择器 div 可以多个,以逗号隔开 (4)父子选择器 以空格隔 ...