题目链接

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

 #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. java 泛型 -- 泛型类,泛型接口,泛型方法

    泛型T泛型的许多最佳例子都来自集合框架,因为泛型让您在保存在集合中的元素上指定类型约束.在定义泛型类或声明泛型类的变量时,使用尖括号来指定形式类型参数.形式类型参数与实际类型参数之间的关系类似于形式方 ...

  2. 【翻译五】java-中断机制

    Interrupts An interrupt is an indication to a thread that it should stop what it is doing and do som ...

  3. [LeetCode] Gas Station

    Recording my thought on the go might be fun when I check back later, so this kinda blog has no inten ...

  4. C++ 内联函数笔记

    要使用内联函数,必须采取下述措施之一: +在函数声明前加上关键字inline: +在函数定义前加上关键字inline. 通常的做法是省略原型,将整个定义(即函数头和所有函数代码)放在本应提供原型的地方 ...

  5. c++ 的 static_cast

    http://www.cnblogs.com/pigerhan/archive/2013/02/26/2933590.html #include "Person.h" #inclu ...

  6. Mishka and Interesting sum Codeforces Round #365 (树状数组)

    树状数组,与Turing Tree类似. xr[i]表示从1到i的抑或,树状数组维护从1到i每个数只考虑一次的异或,结果为sum(r) ^ sum(l) ^ xr[r] ^ xr[l] 其中xr[r] ...

  7. 2-06使用SQL语句创建数据库3

    向现有数据库中添加文件组和数据文件几种方式以及步骤: 第一种:在视图下添加文件组和数据文件. 添加文件组的步骤: 右击你想要添加文件组的数据库点属性,然后点文件组就可以添加. 添加数据文件的步骤: 下 ...

  8. EF中无法使用时间转字符串

    场景: 查询条件需要使用到时间类型,且需要特殊格式化,例:ToString("yyyy-MM-dd"):即,在需要使用时间进行like方式处理时: 此时,用如下方式: var q ...

  9. 提升 LaTeX 效率的小工具:Detexify LaTeX handwritten symbol recognition

    Detexify LaTeX handwritten symbol recognition 用 LaTeX 的人找符号的表示方法通常很费事,需要去翻长长的列表.Detexify 是一个省事的小网站,只 ...

  10. loadrunner怎么将变量保存到参数中

    用这个lr_save_string 函数 char *b = "很简单";lr_save_string(b,"b"); lr_output_message(&q ...