传送门:

HDU:http://acm.hdu.edu.cn/showproblem.php?pid=1010

ZOJ:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=1110

题目大意:

一只狗陷入了迷宫,他每秒必须走一步,并且不能重复走已经走过的地方,给定一个出口,要求在恰好为T的时间到达,如果可以,输出YES否则NO

不断的TLE,然后搜了下题解。

这题最漂亮的剪枝就在于奇偶的判断上。Orz

DFS过程中,设终点的坐标为door_x,door_y。当前的坐标为x,y,目标时间为target,当前时间为step

那么如果他能敲好在target-step的时间到达,那么 target - step 和 abs(door_x - x) + abs(door_y - y) 奇偶性相同。

即 ( target - step ) % 2== ( abs(door_x - x) + abs(door_y - y) ) % 2

根据奇-奇=偶,偶-偶=偶 ,可以直接写成

remain=target- (step + abs(door_x - x) + abs(door_y - y))

remain & 1 (为1的话说明remain最后一位为1,显然奇偶性不同)

其他两个剪枝看代码吧

#include<cstdio>
#include<queue>
#include<cmath>
using namespace std;
const int MAXN=10;
char maze[MAXN][MAXN];
const int dx[]={1 ,-1, 0 , 0};
const int dy[]={0 , 0 ,1 ,-1};
int start_x,start_y,door_x,door_y; bool dfs(int x,int y,int step,int target)
{
if(step>target) //剪枝1
return false; int remain=target- (step + abs(door_x - x) + abs(door_y - y));//当前和终点的距离
if(remain < 0 || remain & 1 ) //剪枝2,如果当前距离更大那么答案显然不存在
return false; //如果奇偶性不同也不行,奇-奇=偶,偶-偶=偶
//Orz想出来的人 for(int i=0;i<4;i++)
{
int nx=x + dx[i];
int ny=y + dy[i];
if(maze[nx][ny]=='.')
{
maze[nx][ny]='X';
if(dfs(nx,ny,step+1,target))
return true;
maze[nx][ny]='.';
}
else if(maze[nx][ny]=='D' && step+1==target)
return true; }
return false;
} int main()
{
int n,m,t;
while(scanf("%d%d%d",&n,&m,&t),n||m||t)
{
int empty=0;
for(int i=1;i<=n;i++)
{
scanf("%s",maze[i]+1); //一开始WA不断就是因为输入
for(int j=1;j<=m;j++)
{
if(maze[i][j]=='S')
start_x=i,start_y=j;
else if(maze[i][j]=='D')
door_x=i,door_y=j;
if(maze[i][j]=='.')
empty++;
}
} if(empty +1 < t) //剪枝3,如果可走的少于出现出口的时间,显然无解。
{
printf("NO\n");
continue;
} for(int i=0;i<=n+1;i++) //最外层直接包上X,省了等下判断越界问题。
maze[i][0]=maze[i][m+1]='X';
for(int i=0;i<=m+1;i++)
maze[0][i]=maze[n+1][i]='X'; printf("%s\n",dfs(start_x,start_y,0,t)==true? "YES":"NO");
}
}

HDU 1010 Tempter of the Bone (ZOJ 2110) DFS+剪枝的更多相关文章

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

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

  2. HDU 1010 Tempter of the Bone【DFS经典题+奇偶剪枝详解】

    Tempter of the Bone Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Othe ...

  3. hdu 1010 Tempter of the Bone 奇偶剪枝

      如果所给的时间(步数) t 小于最短步数path,那么一定走不到. 若满足t>path.但是如果能在恰好 t 步的时候,走到出口处.那么(t-path)必须是二的倍数. 关于第二种方案的解释 ...

  4. hdu.1010.Tempter of the Bone(dfs+奇偶剪枝)

    Tempter of the Bone Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Othe ...

  5. hdu 1010:Tempter of the Bone(DFS + 奇偶剪枝)

    Tempter of the Bone Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Othe ...

  6. Hdu 1010 Tempter of the Bone 分类: Translation Mode 2014-08-04 16:11 82人阅读 评论(0) 收藏

    Tempter of the Bone Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Othe ...

  7. hdu 1010 Tempter of the Bone 深搜+剪枝

    Tempter of the Bone Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Othe ...

  8. hdu 1010 Tempter of the Bone(dfs)

    Tempter of the Bone Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Othe ...

  9. hdu 1010 Tempter of the Bone(深搜+奇偶剪枝)

    Tempter of the Bone Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Othe ...

随机推荐

  1. 【习题 8-6 UVA - 1611】 Crane

    [链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 想把数字i从位置j移动到位置i 可以这样. 假设mov(x,y)表示将(x..x+len/2-1)和(x+len/2..y)交换. ...

  2. [翻译]魅族的M1 Note是十分廉价(dirt-cheap)的iphone5C增强版

    Meizu's M1 Note is a dirt-cheap iPhone 5c on steroids 魅族的M1 Note是十分廉价(dirt-cheap)的ihone5C增强版 While m ...

  3. css大会站点顶部的一个特效

    看到http://css.w3ctech.com/ 上一个效果认为挺赞的. 然后学些了一下. demo地址:http://codepen.io/tianzi77/pen/mJaLWq html结构非常 ...

  4. Android经常使用自己定义控件(二)

           经常使用的Android自己定义控件分享 http://www.see-source.com//androidwidget/list.html?type=&p=1

  5. OPENSSL 制作 Ikev2证书

    OPENSSL 制作 Ikev2证书 在一个 VPS 上配置 IKEV2 VPN 服务器时,用 OPENSSL 制作了所需的数字证书,奇怪的怎么弄都无法连接服务器,一直提示 "IKE_SA ...

  6. 29.局部和全局重载new delete

    #include <iostream> #include <Windows.h> using namespace std; //全局内存管理,统计释放内存,分配内存 //重载全 ...

  7. CentOS 7 网络配置、远程访问

    网络配置(配置固定IP访问) 相关命令 ip add 查看网卡状态 ifup eth0 打开端口eth0 ifdown eth0 关闭端口eth0 dhclient 自动获取IP mii-tool e ...

  8. CTF加密题型解析:RSA算法的CTF解法之一

    RSA介绍 根据加密原理,可以将大部分的加密算法分为两大类:对称加密算法和非对称加密算法.对称加密算法的加密和解密采用的是同一套算法规则.而非对称加密算法加密时用的是公钥(公开给所有人),解密时用的是 ...

  9. 洛谷 P1927 防护伞

    P1927 防护伞 题目描述 据说 2012 的灾难和太阳黑子的爆发有关.于是地球防卫小队决定制造一个特殊防护 伞,挡住太阳黑子爆发的区域,减少其对地球的影响.由于太阳相对于地球来说实在是太 大了,我 ...

  10. 洛谷 P1109 学生分组

    P1109 学生分组 题目描述 有N组学生,给出初始时每组中的学生个数,再给出每组学生人数的上界R和下界L(L<=R),每次你可以在某组中选出一个学生把他安排到另外一组中,问最少要多少次才可以使 ...