题目描述

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

题目来源

ACM训练联盟周赛

分析:比赛的时候用循环模拟的,结果模拟到心态爆炸,是有想过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的更多相关文章

  1. 计蒜客 ACM训练联盟周赛 第一场 Christina式方格取数 思维

    助手Christina发明了一种方格取数的新玩法:在n*m的方格棋盘里,每个格子里写一个数.两个人轮流给格子染色,直到所有格子都染了色.在所有格子染色完后,计算双方的分数.对于任意两个相邻(即有公共边 ...

  2. 计蒜客 ACM训练联盟周赛 第一场 Alice和Bob的Nim游戏 矩阵快速幂

    题目描述 众所周知,Alice和Bob非常喜欢博弈,而且Alice永远是先手,Bob永远是后手. Alice和Bob面前有3堆石子,Alice和Bob每次轮流拿某堆石子中的若干个石子(不可以是0个), ...

  3. ACM训练联盟周赛(第一场)

    B:Zeratul与Xor 题目描述 Xor(按位异或),对应C++中的“^”运算符. Zeratul给出了一个数列A[n](n≤105),要做q(q≤105)组动作,这些动作包括: 1  a:数列中 ...

  4. 计蒜客 28449.算个欧拉函数给大家助助兴-大数的因子个数 (HDU5649.DZY Loves Sorting) ( ACM训练联盟周赛 G)

    ACM训练联盟周赛 这一场有几个数据结构的题,但是自己太菜,不会树套树,带插入的区间第K小-替罪羊套函数式线段树, 先立个flag,BZOJ3065: 带插入区间K小值 计蒜客 Zeratul与Xor ...

  5. 计蒜客 28437.Big brother said the calculation-线段树+二分-当前第k个位置的数 ( ACM训练联盟周赛 M)

    M. Big brother said the calculation 通过线段树维护. 这个题和杭电的一道题几乎就是一样的题目.HDU5649.DZY Loves Sorting 题意就是一个n的排 ...

  6. 计蒜客 ACM竞赛高校联盟训练赛 第8场 煎牛排

    水一水. https://nanti.jisuanke.com/t/24205 煎牛排 题目描述 又是一个难得的周六,是时候远离食堂和外卖出去大吃一顿了.圈内知名吃货AA正想着中午去吃汉堡炸鸡烤肉火锅 ...

  7. 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 ...

  8. ACM训练联盟周赛 K. Teemo's reunited

    Teemo likes to drink raspberry juice.  He even spent some of his spare time tomake the raspberry jui ...

  9. ACM训练联盟周赛 Teemo's formula

    Teemo has a formula and he want to calculate it quickly. The formula is . As the result may be very ...

随机推荐

  1. 华为matebook14vm虚拟机错误

    1.创建时显示不支持64位虚拟机 测试环境: 华为matebook14 window10 专业工作站版  1903   问题描述: 创建虚拟机时显示:此主机不支持64位解决方案   问题参考: 参考1 ...

  2. 一道看似简单的go程序的深入分析

    先上代码: func main() { var a [10]int for i := 0; i < 10; i++ { go func(i int) { for { a[i]++ } }(i) ...

  3. Java的自动装箱/拆箱

    概述 自JDK1.5开始, 引入了自动装箱/拆箱这一语法糖, 它使程序员的代码变得更加简洁, 不再需要进行显式转换.基本类型与包装类型在某些操作符的作用下, 包装类型调用valueOf()方法将原始类 ...

  4. FTP服务端部署

    FTP服务端搭建(本地用户登入:使用本地用户和密码登入)1.文件配置:vsftpd.conf: 主配置文件ftpusers: 指定哪些用户不能访问FTP服务器user_list: 指定的用户是否可以访 ...

  5. 图像反转(一些基本的灰度变换函数)基本原理及Python实现

    1. 基本原理 获取像素值在[0, L]范围内的图像的反转图像,即为负片.适用于增强图像中白色或者灰色的区域,尤其当黑色在图片中占主地位时候 $$T(r) = L-r$$ 2. 运行结果 图源自ski ...

  6. 9.源码分析---SOFARPC是如何实现故障剔除的?

    SOFARPC源码解析系列: 1. 源码分析---SOFARPC可扩展的机制SPI 2. 源码分析---SOFARPC客户端服务引用 3. 源码分析---SOFARPC客户端服务调用 4. 源码分析- ...

  7. python面试总结1(基础章节)

    python语言基础 语言特点 python是静态还是动态类型?是强类型还是弱类型 动态强类型语言 动态还是静态指的是编译期还是运作期确定类型 强类型指的是不会发生隐式类型转换 python作为后端语 ...

  8. Leader-Follower线程模型简介

    参考58沈剑大神架构师之路上的文章,谈谈Leader-Follower线程模型: 上图就是L/F多线程模型的状态变迁点,共6个关键点: (1)线程有3种状态:领导leading,处理processin ...

  9. [Spring cloud 一步步实现广告系统] 19. 监控Hystrix Dashboard

    在之前的18次文章中,我们实现了广告系统的广告投放,广告检索业务功能,中间使用到了 服务发现Eureka,服务调用Feign,网关路由Zuul以及错误熔断Hystrix等Spring Cloud组件. ...

  10. 前端面试题集锦(二)之CSS部分

    1.CSS中的选择器都有哪些?权限情况如何? 解答: (1)类选择器 .className  (2) ID选择器 #id  (3) 元素选择器 div 可以多个,以逗号隔开 (4)父子选择器 以空格隔 ...