HDU 4431 Mahjong(模拟题)
写了俩小时+把....有一种情况写的时候漏了...代码还算清晰把,想了很久才开写的。
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
int p[],flag[],o[],ans[];
int sp[];
int que[];
char str[][];
int hu13[] = {,,,,,,,,,,,,};
void judge13()
{
int i;
int s1,s0,s2,key;
s1 = s2 = s0 = ;
for(i = ; i < ; i ++)
{
if(flag[hu13[i]] == )
{
s0 ++;
key = hu13[i];
}
else if(flag[hu13[i]] == )
s1 ++;
else if(flag[hu13[i]] == )
s2 ++;
}
if(s1 == )
{
for(i = ; i < ; i ++)
ans[hu13[i]] = ;
}
else if(s1 == &&s2 == &&s0 == )
{
ans[key] = ;
}
return ;
}
void judge7d()
{
int i,num = ,key;
for(i = ; i < ; i ++)
{
if(flag[i] == )
num ++;
else if(flag[i] == )
key = i;
}
if(num == )
ans[key] = ;
return ;
}
int dfs(int n,int x,int step)
{
int i,j,a,b,c;
if(x == step)
return ;
for(i = ; i < n; i ++)
{
if(o[i] == )
{
if(sp[i+] == sp[i]&&sp[i+] == sp[i]&&o[i+] == &&o[i+] == )
{
o[i] = ;
o[i+] = ;
o[i+] = ;
if(dfs(n,x+,step))
return ;
o[i] = ;
o[i+] = ;
o[i+] = ;
}
a = b = c = -;
a = i;
for(j = i+; j < n; j ++)
{
if(sp[j] > sp[i] + ) break;
if(sp[j] == sp[i] + &&o[j] == )
b = j;
if(sp[j] == sp[i] + &&o[j] == )
{
c = j;
break;
}
}
if(b != -&&c != -)
{
o[a] = ;
o[b] = ;
o[c] = ;
if(dfs(n,x+,step))
return ;
o[a] = ;
o[b] = ;
o[c] = ;
}
break;
}
}
return ;
}
int main()
{
int t,i,num,j,k,u;
scanf("%d",&t);
while(t--)
{
memset(flag,,sizeof(flag));
memset(ans,,sizeof(ans));
for(i = ; i < ; i ++)
{
scanf("%s",str[i]);
num = str[i][] - '';
if(str[i][] == 'm')
que[i] = num;
else if(str[i][] == 's')
que[i] = num + ;
else if(str[i][] == 'p')
que[i] = num + ;
else
que[i] = num* + ;
flag[que[i]] ++;
}
sort(que,que+);
judge13();
judge7d();
for(i = ; i < ; i ++)
{
if(que[i] == que[i+])
{
num = ;
for(j = ; j < ; j ++)
{
if(j == i||j == i+) continue;
p[num++] = que[j];
}
for(j = ; j < ; j ++)
{
for(k = j+; k < ; k ++)
{
if(p[j] == p[k])
{
if(flag[p[j]] == ) continue;//特判
num = ;
for(u = ; u < ; u ++)
{
if(u == j||u == k) continue;
sp[num++] = p[u];
}
memset(o,,sizeof(o));
if(dfs(,,))
{
ans[p[j]] = ;
}
}
else if(p[j] + == p[k])
{
num = ;
for(u = ; u < ; u ++)
{
if(u == j||u == k) continue;
sp[num++] = p[u];
}
memset(o,,sizeof(o));
if(dfs(,,))
{
if(flag[p[j]-] != )
ans[p[j]-] = ;
if(flag[p[k]+] != )
ans[p[k]+] = ;
}
}
else if(p[j] + == p[k])
{
num = ;
for(u = ; u < ; u ++)
{
if(u == j||u == k) continue;
sp[num++] = p[u];
}
memset(o,,sizeof(o));
if(dfs(,,))
{
if(flag[p[j]+] != )
ans[p[j]+] = ;
}
}
}
}
}
if(flag[que[i]] == ) continue;
num = ;
for(j = ; j < ; j ++)
{
if(j == i) continue;
sp[num++] = que[j];
}
memset(o,,sizeof(o));
if(dfs(,,))
{
ans[que[i]] = ;
}
}
int fi = ;
for(i = ; i <= ; i ++)
if(ans[i])fi ++;
for(i = ; i <= ; i ++)
if(ans[i])fi ++;
for(i = ; i <= ; i ++)
if(ans[i])fi ++;
for(i = ; i <= ; i ++)
if(ans[i]) fi ++;
if(fi == )
printf("Nooten\n");
else
{
printf("%d",fi);
for(i = ; i <= ; i ++)
if(ans[i])printf(" %dm",i);
for(i = ; i <= ; i ++)
if(ans[i])printf(" %ds",i-);
for(i = ; i <= ; i ++)
if(ans[i])printf(" %dp",i-);
for(i = ; i <= ; i ++)
if(ans[i])printf(" %dc",(i-)/);
printf("\n");
}
}
return ;
}
/*
4
1s 1s 1s 1s 2s 2s 2s 2s 3s 3s 3s 3s 4s
*/
HDU 4431 Mahjong(模拟题)的更多相关文章
- HDU 4431 Mahjong 模拟
http://acm.hdu.edu.cn/showproblem.php?pid=4431 不能说是水题了,具体实现还是很恶心的...几乎优化到哭但是DFS(还加了几个剪枝)还是不行...搜索一直T ...
- HDU - 4431 Mahjong (模拟+搜索+哈希+中途相遇)
题目链接 基本思路:最理想的方法是预处理处所有胡牌的状态的哈希值,然后对于每组输入,枚举每种新加入的牌,然后用哈希检验是否满足胡牌的条件.然而不幸的是,由于胡牌的状态数过多(4个眼+一对将),预处理的 ...
- HDU 4431 Mahjong(枚举+模拟)(2012 Asia Tianjin Regional Contest)
Problem Description Japanese Mahjong is a four-player game. The game needs four people to sit around ...
- HDU 4431 Mahjong (DFS,暴力枚举,剪枝)
题意:给定 13 张麻将牌,问你是不是“听”牌,如果是输出“听”哪张. 析:这个题,很明显的暴力,就是在原来的基础上再放上一张牌,看看是不是能胡,想法很简单,也比较好实现,结果就是TLE,一直TLE, ...
- HDU 4121 Xiangqi 模拟题
Xiangqi Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=4121 ...
- HDU 1234 简单模拟题
题目很简单不多说了,我只是觉得这题目的输入方式还是很有特点的 #include <cstdio> #include <cstring> #include <algorit ...
- HDU 4041 Eliminate Witches! (模拟题 ACM ICPC 2011亚洲北京赛区网络赛)
HDU 4041 Eliminate Witches! (模拟题 ACM ICPC 2011 亚洲北京赛区网络赛题目) Eliminate Witches! Time Limit: 2000/1000 ...
- HDU 4452 Running Rabbits (模拟题)
题意: 有两只兔子,一只在左上角,一只在右上角,两只兔子有自己的移动速度(每小时),和初始移动方向. 现在有3种可能让他们转向:撞墙:移动过程中撞墙,掉头走未完成的路. 相碰: 两只兔子在K点整(即处 ...
- hdu 5641 King's Phone(暴力模拟题)
Problem Description In a military parade, the King sees lots of new things, including an Andriod Pho ...
随机推荐
- 在Eclipse中自定义类似syso的快捷代码模板
sysout/syso syserr/ syse 点击菜单栏的“Window”->“Preferences”,打开“Preferences”对话框.在Preferences”对话框中点击“Jav ...
- 5.linux内核模块基础,内核模块学习
linux内核模块基础 一.定义 Linux 内核的整体结构非常庞大,其包含的组件也非常多,如何使用这些组件呢: 方法 1:把所有的组件都编译进内核文件,即:zImage 或 bzImage,但这样会 ...
- ZEALER背后的乐视云视频
ZEALER是我非常喜欢的一个测评网站,经常访问看看手机.电动牙刷及机械键盘的测试视频,非常欣赏王自如的数据化测评理念.敬畏之心,以及不祛痘的视频. 刚好最近对网络视频应用比较感兴趣,觉得ZEALER ...
- MVC LINQ to SQL: Basic Concepts and Features
http://www.codeproject.com/Articles/215712/LINQ-to-SQL-Basic-Concepts-and-Features
- Class.forName()的作用与使用总结
1.Class类简介: Java程序在运行时,Java运行时系统一直对所有的对象进行所谓的运行时类型标识.这项信息纪录了每个对象所属的类.虚拟机通常使用运行时类型信息选准正确方法去执行,用来保存这些类 ...
- Android学习系列(42)--Android Studio实战技巧
使用android studio开发项目的一些问题,功能和技巧. 1. 环境 Mac OSX 10.9.5 + Android Studio 0.8.9 2. gradle项目加载超慢 这是因为gra ...
- Android学习系列(37)--App调试内存泄露之Context篇(下)
接着<Android学习系列(36)--App调试内存泄露之Context篇(上)>继续分析. 5. AsyncTask对象 我N年前去盛大面过一次试,当时面试官极力推荐我使用AsyncT ...
- zepto的bug1
给页面<a>标签绑定了tap事件,在移动设备上点击按钮貌似一切正常,可以正常响应. 但是,把页面上下滑动几次之后,或者在滑动时手指滑动出移动屏幕之外,之后再点击按钮,就会发现第一次点击的时 ...
- 05_Java异常(Exception)
1. 异常的概念 1.1什么是异常 异常指的是程序运行时出现的不正常情况. 1.2异常的层次 Java的异常类是处理运行时的特殊类,每一种异常对应一种特定的运行错误.所有Java异常类都是系统类库中E ...
- FastMM 定位内存泄露的代码位置
FastMM 定位内存泄露的代码位置 开源的FastMM,使用很简单,在工程的第一行引用FastMM4即可(注意,一定要在第一个Uses的位置),可以在调试程序时提示内存泄露情况,还可以生成报告. 在 ...