题目描述

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. DevOps相关知识点

    DevOps 持续集成 简述 持续集成简称CI,是软件的开发和发布标准流程的最重要的部分 作为一个开发实践,在C中可以通过自动化等手段高频地去获取产品反馈并响应反馈的过程 简单的来说,持续集成就是持续 ...

  2. setInterval循环设置并传入不同的参数

    var taskId; var __sto = setInterval; window.setInterval = function(callback,timeout,param){ var args ...

  3. BeanFactory体系结构

    BeanFactory是Spring中非常重要的一个类,搞懂了它,你就知道了bean的初始化和摧毁过程,对于深入理解IOC有很大的帮助. BeanFactory体系结构 首先看一下使用IDEA生成的继 ...

  4. 爬虫获取搜狐汽车的配置信息 和swf动态图表的销量数据-------详细教学

    前情提要:需要爬取搜狐汽车的所有配置信息,具体配置对应的参数. 以及在动态图表上的历史销量. 比如: 一汽奥迪旗下Q5L 的<40 TFSI 荣享进取型 国VI >的历史销量和该配置的参数 ...

  5. Linux基础用户管理

    一.用户管理 (一).用户和组的基本概念 Users and groups:. Every process (running program) on the system runs as a part ...

  6. springboot-jsp打jar问题

    [**前情提要**]最近做了一个项目,项目是springboot+jsp结构的,但是在发布生产环境的时候又需要用maven打成jar包,但是一开始的默认配置都不成功.下面的文章就是具体的解决过程. - ...

  7. Guava cache使用总结

    缓存分为本地缓存和远端缓存.常见的远端缓存有Redis,MongoDB:本地缓存一般使用map的方式保存在本地内存中.一般我们在业务中操作缓存,都会操作缓存和数据源两部分.如:put数据时,先插入DB ...

  8. asp.net core 从单机到集群

    asp.net core 从单机到集群 Intro 这篇文章主要以我的活动室预约的项目作为示例,看一下一个 asp.net core 应用从单机应用到分布式应用需要做什么. 示例项目 活动室预约提供了 ...

  9. C++函数中,两个自动释放内存的动态内存申请类

    最近做一个事情,实现一个流程交互,其中主交互流程函数中,涉及较多的内存申请, 而健康的函数,都是在函数退出前将手动申请不再需要的内存释放掉, 使用很多方法,都避免不了较多的出错分支时,一堆的if fr ...

  10. poli-java开源BI软件

    目录 快速入门 Github地址: 特性 一个易于使用的SQL报告应用程序,专为SQL爱好者而设计. SQL中的电源数据分析,可获得更快的业务洞察力. 快速入门 https://shzlw.githu ...