题目链接

写了俩小时+把....有一种情况写的时候漏了...代码还算清晰把,想了很久才开写的。

 #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(模拟题)的更多相关文章

  1. HDU 4431 Mahjong 模拟

    http://acm.hdu.edu.cn/showproblem.php?pid=4431 不能说是水题了,具体实现还是很恶心的...几乎优化到哭但是DFS(还加了几个剪枝)还是不行...搜索一直T ...

  2. HDU - 4431 Mahjong (模拟+搜索+哈希+中途相遇)

    题目链接 基本思路:最理想的方法是预处理处所有胡牌的状态的哈希值,然后对于每组输入,枚举每种新加入的牌,然后用哈希检验是否满足胡牌的条件.然而不幸的是,由于胡牌的状态数过多(4个眼+一对将),预处理的 ...

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

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

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

  5. HDU 4121 Xiangqi 模拟题

    Xiangqi Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=4121 ...

  6. HDU 1234 简单模拟题

    题目很简单不多说了,我只是觉得这题目的输入方式还是很有特点的 #include <cstdio> #include <cstring> #include <algorit ...

  7. HDU 4041 Eliminate Witches! (模拟题 ACM ICPC 2011亚洲北京赛区网络赛)

    HDU 4041 Eliminate Witches! (模拟题 ACM ICPC 2011 亚洲北京赛区网络赛题目) Eliminate Witches! Time Limit: 2000/1000 ...

  8. HDU 4452 Running Rabbits (模拟题)

    题意: 有两只兔子,一只在左上角,一只在右上角,两只兔子有自己的移动速度(每小时),和初始移动方向. 现在有3种可能让他们转向:撞墙:移动过程中撞墙,掉头走未完成的路. 相碰: 两只兔子在K点整(即处 ...

  9. hdu 5641 King's Phone(暴力模拟题)

    Problem Description In a military parade, the King sees lots of new things, including an Andriod Pho ...

随机推荐

  1. RAC NTP/CTSS

    本文總結主要參考: http://blog.itpub.net/23135684/viewspace-759693/ http://www.happyworld.net.cn/post/6.html ...

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

  3. js判断访问的当前设备是手机还是电脑

    function browserRedirect() { var sUserAgent = navigator.userAgent.toLowerCase(); var bIsIpad = sUser ...

  4. 使用PHP获取时间今天 明天 昨天 时间戳的详解

    使用php获取时间今天明天昨天时间戳 2013-06-20 11:12 <?php echo "今天:".date("Y-m-d")."< ...

  5. 有了iscsi存储怎么让主机识别以及使用创建lvm

    1.查找安装包:rpm -ivh iscsi-initiator-utils去sf.net下载iscsitarget包make kernel,usr,install开启服务 (0)查看iscsi发现记 ...

  6. 第十三篇:在SOUI中使用有窗口句柄的子窗口

    前言: 无论一个DirectUI系统提供的DUI控件多么丰富,总会有些情况下用户需要在DUI窗口上放置有窗口句柄的子窗口. 为了和无窗口句柄的子窗口相区别,这里将有窗口句柄的子窗口称之为真窗口. 每一 ...

  7. 通过jquery-qrcode在线生成二维码

    随着移动互联网的发展,二维码现在应用得越来越广泛了,随手扫扫就可以浏览网站.加个好友什么的,比起手工输入真的是方便太多了. 前期做了一个综合测评系统,考虑逐步实现移动化,一长串的IP地址用户输入也不方 ...

  8. dwz的form表单中url的变量替换

    form表单中action的地址格式 “__URL__/edit/{xxx}”,大括号内的 “xxx” 就是变量名,主要功能是结合table组件一起使用. 下图中的删除.编辑.修改密码都是用了url变 ...

  9. POJ 2750 Potted Flower (线段树区间合并)

    开始懵逼找不到解法,看了网上大牛们的题解才发现是区间合并...  给你n个数形成一个数列环,然后每次进行一个点的修改,并输出这个数列的最大区间和(注意是环,并且区间最大只有n-1个数) 其实只需要维护 ...

  10. 简单记录在Visual Studio 2013中创建ASP.NET Web API 2

    在很多跨平台的应用中就需要Web API ,比如android与数据库的交互. Create a Web API Project 选择新建项目下的模板下的Visual C#节点下的Web节点,在模板列 ...