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 题意:给出一个有根树,问对于每一个节点它的子树中有多少个节点的值是小于它的. 思路:这题和那道苹果树是一样 ...
随机推荐
- 重温WCF之WCF传输安全(十三)(3)基于SSL的WCF对客户端验证(转)
转载地址:http://www.cnblogs.com/lxblog/archive/2012/09/18/2690719.html 上文我们演示了,客户端对服务器端身份的验证,这一篇来简单演示一下对 ...
- Delphi之DLL知识学习2---静态链接和动态链接
静态连接 静态链接是指Delphi 编译器把要调用的函数和过程编译成可执行代码.函数的代码可存留在应用程序的 .dpr文件或一单元中.当链接用户的应用程序时,这些函数与过程便成为最终的可执行文件的一部 ...
- SQL SERVER 统计信息概述(Statistics)
前言 查询优化器使用统计信息来创建可提高查询性能的查询计划,对于大多数查询,查询优化器已经为高质量查询计划生成必要的统计信息,但是在少数情况下,您需要创建附加的统计信息或者修改查询设计以得到最佳结果. ...
- golang exec Command
package mainimport ( "fmt" "log" "os/exec")func main() { out, err := e ...
- wp8 入门到精通 仿QQPivot 提示数量
<Grid x:Name="LayoutRoot" Background="White"> <Grid Width="480&quo ...
- C语言中结构体的位域(bit-fields)
转自:http://blog.sina.com.cn/s/blog_6240b5980100tcba.html 有些信息在存储时,并不需要占用一个完整的字节, 而只需占几个或一个二进制位.例如在存放一 ...
- NuGet学习笔记(3) 搭建属于自己的NuGet服务器
文章导读 创建NuGetServer Web站点 发布站点到IIS 添加本地站点到包包数据源 在上一篇NuGet学习笔记(2) 使用图形化界面打包自己的类库 中讲解了如何打包自己的类库,接下来进行最重 ...
- Java学习笔记(九)——继承
一.继承 1.概念: 继承是类于类之间的关系,是一种"is a "的关系 Ps: Java是单继承 2.优势: (1)子类直接拥有父类的所有属性和方法(除了privata) (2) ...
- Java 之 多线程编程
1.线程: a.由来:单任务OS -- 多任务OS b.进程:每一个进程对应一个应用程序,分配独立内存空间 c.线程:线程是进程内部的一个独立的执行分支 d.特点:共享内容地址空间,切换成本更低 2. ...
- Liferay 6.2 改造系列之十九:修改站点设置的表单内容
在/portal-master/portal-impl/src/portal.properties文件中,有如下配置: # # Input a list of sections that will b ...