Mahjong

Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 2464 Accepted Submission(s): 522

Problem Description
Japanese Mahjong is a four-player game. The game needs four people to sit around a desk and play with a set of Mahjong tiles. A set of Mahjong tiles contains four copies of the tiles described next:

One to nine Man, which we use 1m to 9m to represent;

One to nine Sou, which we use 1s to 9s to represent;

One to nine Pin, which we use 1p to 9p to represent;

Character tiles, which are:Ton, Nan, Sei, Pei, Haku, Hatsu, Chun, which we use 1c to 7c to represent.

A winning state means a set of 14 tiles that normally contains a pair of same tiles (which we call "eyes") and four melds. A meld is formed by either three same tiles(1m, 1m, 1m or 2c, 2c, 2c for example) or three continuous non-character tiles(1m, 2m, 3m or 5s, 6s, 7s for example).

However, there are two special winning states that are different with the description above, which are:

"Chii Toitsu", which means 7 different pairs of tiles;

"Kokushi Muso", which means a set of tiles that contains all these tiles: 1m, 9m, 1p, 9p, 1s, 9s and all 7 character tiles. And the rest tile should also be one of the 13 tiles above.

And the game starts with four players receiving 13 tiles. In each round every player must draw one tile from the deck one by one. If he reaches a winning state with these 14 tiles, he can say "Tsu Mo" and win the game. Otherwise he should discard one of his 14 tiles. And if the tile he throws out can form a winning state with the 13 tiles of any other player, the player can say "Ron" and win the game.

Now the question is, given the 13 tiles you have, does there exist any tiles that can form a winning state with your tiles?

(Notes: Some of the pictures and descriptions above come from Wikipedia.)

 
Input
The input data begins with a integer T(1≤T≤20000). Next are T cases, each of which contains 13 tiles. The description of every tile is as above.
 
Output
For each cases, if there actually exists some tiles that can form a winning state with the 13 tiles given, print the number first and then print all those tiles in order as the description order of tiles above. Otherwise print a line "Nooten"(without quotation marks).
 
Sample Input
2
1s 2s 3s 2c 2c 2c 2p 3p 5m 6m 7m 1p 1p
1p 1p 2p 3p 4s 5s 6s 7c 7c 3s 3s 2m 2m
 
Sample Output
2 1p 4p
Nooten
 
Source
 
Recommend
zhoujiaqi2010
细节啊,细节,要注意,wrong了一天,就是那么一点点的小bug,这题其实,因为,麻将不多,我们把所有的麻将都枚举出来就可以了!
#include <iostream>
#include <stdio.h>
#include <algorithm>
#include <string.h>
using namespace std;
char charmap[34][3]={
"1m","2m","3m","4m","5m","6m","7m","8m","9m",
"1s","2s","3s","4s","5s","6s","7s","8s","9s",
"1p","2p","3p","4p","5p","6p","7p","8p","9p",
"1c","2c","3c","4c","5c","6c","7c"};
int num19[15]={0,8,9,17,18,26,27,28,29,30,31,32,33},num[34];
int prime[34],result[40],ans,all=33;char str[13];
int charchange(char ss[])
{
switch(ss[1])
{
case 'm':return ss[0]-'0'-1;
case 's':return 8+ss[0]-'0';
case 'p':return 17+ss[0]-'0';
case 'c':return 26+ss[0]-'0';
}
return -1;
}
int find1()
{
int i,j,k,cnt;
for(i=0;i<=all;i++)
{
if(num[i]>=2)
{
cnt=0;
for(j=0;j<=all;j++)
{
if(i!=j)prime[j]=num[j];
else prime[j]=num[j]-2;
}
for(j=0;j<=all;j++)
{
if(prime[j]>=3)
{
prime[j]-=3;
cnt++;
}
if(prime[j]>0)
{
k=prime[j];
if(j+2<27&&prime[j+1]>=k&&prime[j+2]>=k&&j/9==(j+2)/9)
{
cnt+=k;
prime[j]-=k,prime[j+1]-=k,prime[j+2]-=k;
}
}
}
if(cnt==4)
return 1;
}
}
return 0;
}
int find2()
{
int i;
for(i=0;i<=all;i++)
{
if(num[i]!=2&&num[i]!=0)
return 0;
}
return 1;
}
int find3()
{
int i,r=0;
for(i=0;i<13;i++)
{
if(num[num19[i]]==0)
return 0;
r+=num[num19[i]];
}
if(r==14)
return 1;
return 0;
}
int main()
{
int n,i,k,j;
scanf("%d",&n);
while(n--)
{
ans=-1;
memset(num,0,sizeof(num));
for(i=0;i<13;i++)
{
scanf("%s",str);
num[charchange(str)]++;
}
//for(i=0;i<=all;i++)
//printf("i%d %d i\n",i,num[i]);
for(i=0;i<=all;i++)
{
if(num[i]>=4)
continue;
num[i]++;
if(find1())
result[++ans]=i;
else if(find2())
result[++ans]=i;
else if(find3())
result[++ans]=i;
num[i]--;
}
if(ans>=0)
{
printf("%d",ans+1);
for(i=0;i<=ans;i++)
{
printf(" %c%c",charmap[result[i]][0],charmap[result[i]][1]);
}
printf("\n");
}
else
printf("Nooten\n");
}
return 0;
}

hdu4431 Mahjong的更多相关文章

  1. hdu4431 Mahjong 枚举搜索。。

    japanese麻将什么玩意..都没有豪华七对... 没什么难的 就是枚举搜索了 分三种类型的胡牌 f1是七对 f2是十三幺 f3是普通的胡牌 就先找一对 再找三个三个的 就是一直超时..在峰峰的指导 ...

  2. 2015暑假多校联合---Mahjong tree(树上DP 、深搜)

    题目链接 http://acm.split.hdu.edu.cn/showproblem.php?pid=5379 Problem Description Little sun is an artis ...

  3. UVa 11210 (DFS) Chinese Mahjong

    大白书第一章的例题,当时看起来很吃力,现如今A这道题的话怎么写都无所谓了. 思路很简单,就是枚举胡哪张牌,然后枚举一下将牌,剩下如果能找到4个顺子或者刻子就胡了. 由于粗心,34个字符串初始化写错,各 ...

  4. HDU 4431 Mahjong (DFS,暴力枚举,剪枝)

    题意:给定 13 张麻将牌,问你是不是“听”牌,如果是输出“听”哪张. 析:这个题,很明显的暴力,就是在原来的基础上再放上一张牌,看看是不是能胡,想法很简单,也比较好实现,结果就是TLE,一直TLE, ...

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

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

  6. Chinese Mahjong UVA - 11210 (暴力+回溯递归)

    思路:得到输入得到mj[]的各个牌的数量,还差最后一张牌.直接暴力枚举34张牌就可以了. 当假设得到最后一张牌,则得到了的牌看看是不是可以胡,如果可以胡的话,就假设正确.否者假设下一张牌. 关键还是如 ...

  7. Chinese Mahjong UVA - 11210 (DFS)

    先记录下每一种麻将出现的次数,然后枚举每一种可能得到的麻将,对于这个新的麻将牌,去判断可不可能胡,如果可以胡,就可以把这张牌输出出来. 因为eye只能有一张,所以这个是最好枚举的,就枚举每张牌成为ey ...

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

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

  9. bzoj 1860: [Zjoi2006]Mahjong麻将 题解

    [原题] 1860: [Zjoi2006]Mahjong麻将 Time Limit: 1 Sec  Memory Limit: 64 MB Submit: 211  Solved: 122 [Subm ...

随机推荐

  1. git 代理设置

    git 代理设置: git config --global http.proxy http://proxy.com:8080git config --global https.proxy http:/ ...

  2. Apache的Mod_rewrite学习(RewriteRule重写规则的语法)

    URL:http://www.tenwe.com/tech/web/server/200705/content_1548.shtml 今天学习重写规则的语法.RewriteRuleSyntax: Re ...

  3. Vim中如何全选并复制?

    全部删除:按esc后,然后dG全部复制:按esc后,然后ggyG 全选高亮显示:按esc后,然后ggvG(这个好像有点问题)或者ggVG正确 vim如何与剪贴板交互(将vim的内容复制出来) 习惯了在 ...

  4. BZOJ 1828

    program bzoj1828; ; check=; type node=record l,r,s,a:longint; end; ..maxn*] of node; a,b,c:..maxn] o ...

  5. stm32之USART通信

    任何USART通信,需要用到2个对外连接的引脚:RxD,TxD: RxD是输入引脚,用于串行数据接收: TxD是输出引脚,用于串行数据发送: SCLK引脚:发生器时钟输出(同步模式下,异步模式下不需要 ...

  6. java反射机制入门01

    java反射机制入门是我从极客学院的视频中学习的. 1.反射机制背景概述 反射(Reflection)是java被视为动态(或准动态)语言的一个关键性质.反射机制指的是程序在运行时能够获取任何类的内部 ...

  7. linux嵌入式: 实现自己的tree命令

    //# cat treecmd.c #include<stdio.h> #include<dirent.h> #include<sys/stat.h> #inclu ...

  8. No persister for 编译器每行执行两次的解决方法

    是前台的  js  的 datagrid 部件加了 oncheck  事件引起

  9. Nginx+tomcat集群环境搭建

    实验环境:windows xp sp3 Nginx版本:1.5.12: 下载地址:http://nginx.org/en/download.html Tomcat版本:6.0.39 下载地址:http ...

  10. c++ - Create empty json array with jsoncpp - Stack Overflow

    python中multiprocessing.pool函数介绍_正在拉磨_新浪博客     multiprocessing.pool c++ - Create empty json array wit ...