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 ...
随机推荐
- RAC NTP/CTSS
本文總結主要參考: http://blog.itpub.net/23135684/viewspace-759693/ http://www.happyworld.net.cn/post/6.html ...
- ORA-1461 encountered when generating server alert SMG-3500
Doc ID 461911.1 Patch 6602742 Applies to: Oracle Database - Enterprise Edition - Version 10.2.0.3 an ...
- js判断访问的当前设备是手机还是电脑
function browserRedirect() { var sUserAgent = navigator.userAgent.toLowerCase(); var bIsIpad = sUser ...
- 使用PHP获取时间今天 明天 昨天 时间戳的详解
使用php获取时间今天明天昨天时间戳 2013-06-20 11:12 <?php echo "今天:".date("Y-m-d")."< ...
- 有了iscsi存储怎么让主机识别以及使用创建lvm
1.查找安装包:rpm -ivh iscsi-initiator-utils去sf.net下载iscsitarget包make kernel,usr,install开启服务 (0)查看iscsi发现记 ...
- 第十三篇:在SOUI中使用有窗口句柄的子窗口
前言: 无论一个DirectUI系统提供的DUI控件多么丰富,总会有些情况下用户需要在DUI窗口上放置有窗口句柄的子窗口. 为了和无窗口句柄的子窗口相区别,这里将有窗口句柄的子窗口称之为真窗口. 每一 ...
- 通过jquery-qrcode在线生成二维码
随着移动互联网的发展,二维码现在应用得越来越广泛了,随手扫扫就可以浏览网站.加个好友什么的,比起手工输入真的是方便太多了. 前期做了一个综合测评系统,考虑逐步实现移动化,一长串的IP地址用户输入也不方 ...
- dwz的form表单中url的变量替换
form表单中action的地址格式 “__URL__/edit/{xxx}”,大括号内的 “xxx” 就是变量名,主要功能是结合table组件一起使用. 下图中的删除.编辑.修改密码都是用了url变 ...
- POJ 2750 Potted Flower (线段树区间合并)
开始懵逼找不到解法,看了网上大牛们的题解才发现是区间合并... 给你n个数形成一个数列环,然后每次进行一个点的修改,并输出这个数列的最大区间和(注意是环,并且区间最大只有n-1个数) 其实只需要维护 ...
- 简单记录在Visual Studio 2013中创建ASP.NET Web API 2
在很多跨平台的应用中就需要Web API ,比如android与数据库的交互. Create a Web API Project 选择新建项目下的模板下的Visual C#节点下的Web节点,在模板列 ...