题目链接

很繁琐的爆搜,最多要加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)的更多相关文章

  1. hdu 4753 Fishhead’s Little Game 博弈论+记忆化搜索

    思路:状态最多有2^12,采用记忆化搜索!! 代码如下: #include<iostream> #include<stdio.h> #include<algorithm& ...

  2. hdu 4753 Fishhead’s Little Game

    状态压缩dp解博弈问题(记忆化搜索).比赛的时候最后才开始做这道题,而且当时不知道为什么一直犯一些很2B的问题,导致没能ac,晚上看了看原先的代码,改了一下就MLE了...我原先是开的dp[1 < ...

  3. HDU 1010 Tempter of the Bone --- DFS

    HDU 1010 题目大意:给定你起点S,和终点D,X为墙不可走,问你是否能在 T 时刻恰好到达终点D. 参考: 奇偶剪枝 奇偶剪枝简单解释: 在一个只能往X.Y方向走的方格上,从起点到终点的最短步数 ...

  4. HDU 1078 FatMouse and Cheese ( DP, DFS)

    HDU 1078 FatMouse and Cheese ( DP, DFS) 题目大意 给定一个 n * n 的矩阵, 矩阵的每个格子里都有一个值. 每次水平或垂直可以走 [1, k] 步, 从 ( ...

  5. hdu 1258 Sum It Up(dfs+去重)

    题目大意: 给你一个总和(total)和一列(list)整数,共n个整数,要求用这些整数相加,使相加的结果等于total,找出所有不相同的拼凑方法. 例如,total = 4,n = 6,list = ...

  6. HDU 1010 Tempter of the Bone(DFS+奇偶剪枝)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1010 题目大意: 输入 n m t,生成 n*m 矩阵,矩阵元素由 ‘.’ 'S' 'D' 'X' 四 ...

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

  8. HDU 1978 记忆化搜索(dfs+dp)

    Y - How many ways Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u S ...

  9. HDU 3887:Counting Offspring(DFS序+树状数组)

    http://acm.hdu.edu.cn/showproblem.php?pid=3887 题意:给出一个有根树,问对于每一个节点它的子树中有多少个节点的值是小于它的. 思路:这题和那道苹果树是一样 ...

随机推荐

  1. Ajax 的 GET 和 POST 模式

    Ajax 异步请求数据的方式有两种:GET 和 POST. 如果是 GET 模式,则直接将数据放置到异步请求的 URL 地址中,而 send() 方法不发送任何数据: var queryString ...

  2. oracle使用dbms_metadata包取得所有对象DDL语句

    当我们想要查看某个表或者是表空间的DDL的时候,可以利用dbms_metadata.get_ddl这个包来查看. dbms_metadata包中的get_ddl函数详细参数 GET_DDL函数返回创建 ...

  3. html5 三角形

    html5 三角形 <!DOCTYPE html> <html> <head lang="en"> <meta charset=" ...

  4. linux下搭建属于自己的博客(WordPress安装)

    转自:http://www.cnblogs.com/xiaofengkang/archive/2011/11/16/2251608.html WordPress简介 WordPress 是一种使用 P ...

  5. 从官方ROM中提取原生APK

    背景:由于自己手机总出现android.process.acore问题,最后发现是被自己精简掉了日历相关应用,故寻找提取原生apk. 注:解决方案主要是在机锋论坛上看到的. 环境要求:需要电脑安卓ja ...

  6. 通过yeelink平台监控树莓派CPU温度变化

    通过yeelink平台监控树莓派温度,是很多派友入门第一课.作为一名刚入手树莓派裸机不久的新手,在没有其他硬件支持的情况,通过yeelink平台来监控树莓派CPU温度变化,也是我学习树莓派.学习智能硬 ...

  7. windows 2003 企业版 下载地址+序列号

    迅雷地址: thunder://QUFodHRwOi8vcy5zYWZlNS5jb20vV2luZG93c1NlcnZlcjIwMDNTUDJFbnRlcnByaXNlRWRpdGlvbi5pc29a ...

  8. Fragment实现兼容手机和平板

    Android手机的设置界面,点击一下Sound,可以跳转到声音设置界面,如下面两张图所示:             然后再来看一下Android Pad的设置界面,主设置页面和声音设置页面都是在一个 ...

  9. zookeeper源码分析三LEADER与FOLLOWER同步数据流程

    根据二)中的分析,如果一台zookeeper服务器成为集群中的leader,那么一定是当前所有服务器中保存数据最多的服务器,所以在这台服务器成为leader之后,首先要做的事情就是与集群中的其它服务器 ...

  10. LoadRunner11录制APP脚本(2)

    通过安卓模拟器实现LoadRunner11录制APP脚本 http://www.51testing.com/html/24/15110424-3686857.html http://www.51tes ...