HDU 4753 Fishhead’s Little Game(DFS)
很繁琐的爆搜,最多要加2^12条边,暴力就可以,回溯那部分一直没有回溯好,写了一晚上。。。代码非常,非常难看。。对了,还不是普通的爆搜,双向搜索博弈,以前记得看过,这次好像第一次写。。
#include <iostream>
#include <cstring>
#include <cstdio>
#include <cmath>
#include <algorithm>
using namespace std;
int p[][],flag[],o[][];
int que[];
int sp[];
int sf[];
int num,sz;
int t1,t2;
int dfs1(int x,int tc,int jc);
int dfs2(int x,int tc,int jc);
int fun(int a,int b,int c,int nu)
{
if(sz == )
{
if(sf[nu] == &&sp[a]&&sp[b]&&sp[c])
{
sf[nu] = ;
return ;
}
else
return ;
}
else
{
if(sf[nu] == &&sp[a]&&sp[b]&&sp[c])
{
sf[nu] = ;
return ;
}
else
return ;
}
}
int judge(int x)
{
if(x <= )
return fun(+x,+x,+x,x);
else if(x <= )
return fun(x-,x+,x+,x-) + fun(x+,x+,x+,x);
else if(x <= )
return fun(x-,x+,x+,x-) + fun(x+,x+,x+,x);
else if(x <= )
return fun(x-,x+,x+,x-);
else if(x == )
return fun(,,,);
else if(x == )
return fun(,,,);
else if(x == )
return fun(,,,);
else if(x == )
return fun(,,,);
else if(x == )
return fun(,,,);
else if(x == )
return fun(,,,);
else if(x == || x == )
return fun(x-,x-,x-,x-) + fun(x+,x-,x-,x-);
else if(x == ||x == )
return fun(x-,x-,x-,x-) + fun(x+,x-,x-,x-);
else if(x == ||x == )
return fun(x-,x-,x-,x-) + fun(x+,x-,x-,x-);
return ;
}
int dfs1(int x,int tc,int jc)
{
int i,z,s;
if(x == (<<num)-)
{
if(tc > jc)
return ;
else
return ;
}
s = ;
for(i = ; i < num; i ++)
{
if((x&(<<i)) == )
{
sz = ;
z = judge(que[i]);
sp[que[i]] = ;
if(dfs2(x+(<<i),tc+z,jc) == )
s = ;
sp[que[i]] = ;
sz = ;
judge(que[i]);
}
if(s) return s;//为了回溯,回溯完了,再返回。
}
return s;
}
int dfs2(int x,int tc,int jc)
{
int i,z,s;
if(x == (<<num)-)
{
if(tc > jc)
return ;
else
return ;
}
s = ;
for(i = ; i < num; i ++)
{
if((x&(<<i)) == )
{
sz = ;
sp[que[i]] = ;
z = judge(que[i]);
if(dfs1(x+(<<i),tc,jc+z) == )
s = ;
sz = ;
judge(que[i]);
sp[que[i]] = ;
}
if(s) return s;
}
return s;
}
int main()
{
int i,j,k,t,u,v,n,tc,jc,cas = ;
k = ;
for(i = ; i <= ; i ++)
{
for(j = ; j <= ; j ++)
p[i][j] = k ++;
}
k = ;
for(i = ; i <= ; i ++)
{
for(j = ; j <= ; j ++)
{
// printf("%d %d\n",p[i][j],p[i][j+1]);
o[p[i][j]][p[i][j+]] = k ++;
}
}
for(i = ; i <= ; i ++)
{
for(j = ; j <= ; j ++)
{
//printf("%d %d\n",p[i][j],p[i+1][j]);
o[p[i][j]][p[i+][j]] = k ++;
}
}
scanf("%d",&t);
while(t--)
{
memset(flag,,sizeof(flag));
memset(sp,,sizeof(sp));
memset(sf,,sizeof(sf));
scanf("%d",&n);
num = ;
tc = jc = ;
sz = ;
for(i = ; i < n; i ++)
{
scanf("%d%d",&u,&v);
int te;
if(u > v)
{
te = u;
u = v;
v = te;
}
if(i% == )
tc += judge(o[u][v]);
else
jc += judge(o[u][v]);
flag[o[u][v]] = ;
sp[o[u][v]] = ;
}
for(i = ; i < ; i ++)
{
if(!flag[i])
que[num++] = i;
}
printf("Case #%d: ",cas ++);
if(n% == )
{
if(dfs1(,tc,jc))
printf("Tom200\n");
else
printf("Jerry404\n");
}
else
{
if(dfs1(,jc,tc))
printf("Jerry404\n");
else
printf("Tom200\n");
}
}
return ;
}
HDU 4753 Fishhead’s Little Game(DFS)的更多相关文章
- hdu 4753 Fishhead’s Little Game 博弈论+记忆化搜索
思路:状态最多有2^12,采用记忆化搜索!! 代码如下: #include<iostream> #include<stdio.h> #include<algorithm& ...
- hdu 4753 Fishhead’s Little Game
状态压缩dp解博弈问题(记忆化搜索).比赛的时候最后才开始做这道题,而且当时不知道为什么一直犯一些很2B的问题,导致没能ac,晚上看了看原先的代码,改了一下就MLE了...我原先是开的dp[1 < ...
- HDU 1010 Tempter of the Bone --- DFS
HDU 1010 题目大意:给定你起点S,和终点D,X为墙不可走,问你是否能在 T 时刻恰好到达终点D. 参考: 奇偶剪枝 奇偶剪枝简单解释: 在一个只能往X.Y方向走的方格上,从起点到终点的最短步数 ...
- HDU 1078 FatMouse and Cheese ( DP, DFS)
HDU 1078 FatMouse and Cheese ( DP, DFS) 题目大意 给定一个 n * n 的矩阵, 矩阵的每个格子里都有一个值. 每次水平或垂直可以走 [1, k] 步, 从 ( ...
- hdu 1258 Sum It Up(dfs+去重)
题目大意: 给你一个总和(total)和一列(list)整数,共n个整数,要求用这些整数相加,使相加的结果等于total,找出所有不相同的拼凑方法. 例如,total = 4,n = 6,list = ...
- HDU 1010 Tempter of the Bone(DFS+奇偶剪枝)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1010 题目大意: 输入 n m t,生成 n*m 矩阵,矩阵元素由 ‘.’ 'S' 'D' 'X' 四 ...
- HDU 1312 Red and Black (dfs)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1312 Red and Black Time Limit: 2000/1000 MS (Java/Oth ...
- HDU 1978 记忆化搜索(dfs+dp)
Y - How many ways Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u S ...
- HDU 3887:Counting Offspring(DFS序+树状数组)
http://acm.hdu.edu.cn/showproblem.php?pid=3887 题意:给出一个有根树,问对于每一个节点它的子树中有多少个节点的值是小于它的. 思路:这题和那道苹果树是一样 ...
随机推荐
- Codeforces Round #363 Fix a Tree(树 拓扑排序)
先做拓扑排序,再bfs处理 #include<cstdio> #include<iostream> #include<cstdlib> #include<cs ...
- 攻城狮在路上(叁)Linux(二十六)--- linux文件系统的特殊查看与操作
一.boot sector 与 super block的关系: 1.boot sector用于存放引导装载程序,占用1024个字节. 2.super block的大小也为1024字节. 3.若bloc ...
- 攻城狮在路上(叁)Linux(二十四)--- linux设置开机挂载及镜像文件挂载
虽然可以手动进行文件系统的挂载,但是每次都手动挂载就会很麻烦,开机挂载的目的就是实现文件系统的自动挂载. 一.开机挂载:/etc/fstab及/etc/mtab 主要是通过修改/etc/fstab文件 ...
- [荐]jquery插件开发入门
http://www.cnblogs.com/Wayou/p/jquery_plugin_tutorial.html $.fn.myPlugin = function() { //在这里面,this指 ...
- 安装.net Framework 3.5 SP1非常慢的解决方案
解决方案:1.msiexec /unregserver回车,在输入命令:msiexec /regserver msiexec /unregserver是停止installer服务,而msiexec / ...
- git warning: LF will be replaced by CRLF in...
如果你有git项目,在提交代码的过程中可能会碰到上面的警告,特别是的项目中包含序列化对象的时候,你可能要小心!! 警告的含义是说换行符的,不同的操作系统的换行符是不一致的,如果你不清楚,真得看看这个 ...
- 【SSH】 之 Struts2
(一)Struts2是什么? Struts2是一个基于MVC设计模式的Web应用框架,它本质上相当于一个servlet,在MVC设计模式中,Struts2作为控制器(Controller)来建立模型与 ...
- matlab报错
这可能说明..压根就没有这个函数
- Java eclipse下 Ant build.xml实例详解
在有eclipse集成环境下ant其实不是很重要,但有些项目需要用到,另外通过eclipse来学习和理解ant是个很好的途径,所以写他demo总结下要点,希望能够帮到大家. 一.本人测试环境eclip ...
- POJ 1182 食物链 (经典带权并查集)
第三次复习了,最经典的并查集 题意:动物王国中有三类动物A,B,C,这三类动物的食物链构成了有趣的环形.A吃B, B吃C,C吃A. 现有N个动物,以1-N编号.每个动物都是A,B,C中的一种,但是我们 ...