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 ...
随机推荐
- Android画面显示原理
转自: http://blog.csdn.net/luoshengyang/article/details/7691321/ http://blog.chinaunix.net/uid-1675954 ...
- c# 扩展方法奇思妙用基础篇八:Distinct 扩展(转载)
转载地址:http://www.cnblogs.com/ldp615/archive/2011/08/01/distinct-entension.html 刚看了篇文章 <Linq的Distin ...
- Delphi之DLL知识学习4---创建DLL
下面是在Delphi中创建一个DLL的全过程,你将看到怎样创建一个接口单元,使之可以被其他的应用程序访问.并且将学会怎么把Delphi的窗体加入DLL中. 一.数美分:一个简单的DLL 下面是包含一个 ...
- Delphi运算符总结
分类 运算符 操作 操作数 结果类型 范例 算术运算符(加法.减法和乘法运算符的结果为参加运算的两个数据中的精度高的类型) + 加 整数,实数 整数,实数 X + Y - 减 整数,实数 整数,实数 ...
- 【翻译十五】-java并发之固定对象与实例
Immutable Objects An object is considered immutable if its state cannot change after it is construct ...
- 最终排名 sdut 2446
最终排名 Time Limit: 1000ms Memory limit: 65536K 有疑问?点这里^_^ 题目描述 题目链接:http://acm.sdut.edu.cn/sdutoj/p ...
- [LeetCode] Valid Parentheses
Given a string containing just the characters '(', ')', '{', '}', '[' and ']', determine if the inpu ...
- php mysql PDO基本操作
<?php $dbh = new PDO('mysql:host=localhost;dbname=localhost', 'root', ''); $dbh->setAttribute( ...
- python学习第三天
小结: 总体上,python是解释型语言,开源比较好,速度较慢,装逼神器,解释器较常用的是CPython,安装后python进入运行环境 exit()退出 第一个hello world : print ...
- Fragemnt和TextView的交互(TextView在LinearLayout中)
import android.support.v4.app.Fragment;import android.support.v4.app.FragmentActivity;import android ...