HDU 1010 Tempter of the Bone(深度+剪枝)
http://acm.hdu.edu.cn/showproblem.php?pid=1010
题意:就是给出了一个迷宫,小狗必须经过指定的步数到达出口,并且每个格子只能走一次。
首先先来介绍一下奇偶性剪枝:

在这道题目中,如果使用剪枝的话,可以节省不少的时间。
在这道题目中,每次dfs循环时都可以判断一下小狗当前位置与终点所相差的步数,如果不为偶数的话,说明到达不了终点,就可以退出这个循环,不必继续dfs了。
在这道题目中,由于每个格子只能经过一次,所以经过一次后,可以把该点位置改为‘X’,然后我wa了好久,后来明白每次dfs循环后得把这个点的位置重新改回‘.’。
#include<iostream>
#include<cstring>
#include<string>
using namespace std; char map[][];
int d[][] = { { , }, { -, }, { , }, { , - } };
int flag,n,m,t,dx,dy; void dfs(int x,int y,int time)
{
if (x<||x>n||y<||y>m ||flag||time>t) return; //出界
if (time == t && x==dx && y==dy)
{
flag = ;
return;
}
int s1 = x - dx;
int s2 = y - dy;
int ans = t - time - abs(s1) - abs(s2); //剪枝,如果当前剩余的所要求的步数减去小狗
if (ans<||ans%) return; //当前位置与终点的步数不为偶数的话,则结束
for (int i = ; i < ; i++)
{
if (map[x + d[i][]][y + d[i][]] != 'X')
{
map[x + d[i][]][y + d[i][]] = 'X';
dfs(x + d[i][], y + d[i][], time+);
map[x + d[i][]][y + d[i][]] = '.'; //这里必须把该点的值还原回来,不然影响后续的dfs
}
}
return;
} int main()
{
int x,y,wall;
while (cin >> n >> m >> t, n && m && t)
{
if (!m || !n || !t)
{
cout << "NO" << endl;
continue;
}
flag = ;
wall = ;
for (int i = ; i <= n;i++)
for (int j = ; j <= m; j++)
{
cin >> map[i][j];
if (map[i][j] == 'S')
{
x = i;
y = j;
}
if (map[i][j] == 'D')
{
dx = i;
dy = j;
}
if (map[i][j] == 'X')
wall++;
}
if (n*m - wall <t) //剪枝,如果所有点减去墙小于指定步数,那肯定是不行的
{
cout << "NO" << endl;
continue;
}
map[x][y] = 'X';
dfs(x,y,);
if (flag == ) cout << "YES" << endl;
else cout << "NO" << endl;
}
return ;
}
HDU 1010 Tempter of the Bone(深度+剪枝)的更多相关文章
- hdu 1010 Tempter of the Bone 奇偶剪枝
如果所给的时间(步数) t 小于最短步数path,那么一定走不到. 若满足t>path.但是如果能在恰好 t 步的时候,走到出口处.那么(t-path)必须是二的倍数. 关于第二种方案的解释 ...
- HDU 1010 Tempter of the Bone --- DFS
HDU 1010 题目大意:给定你起点S,和终点D,X为墙不可走,问你是否能在 T 时刻恰好到达终点D. 参考: 奇偶剪枝 奇偶剪枝简单解释: 在一个只能往X.Y方向走的方格上,从起点到终点的最短步数 ...
- 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 ...
- 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 ...
- 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 ...
- hdu 1010 Tempter of the Bone 深搜+剪枝
Tempter of the Bone Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Othe ...
- hdu 1010 Tempter of the Bone(深搜+奇偶剪枝)
Tempter of the Bone Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Othe ...
- 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 ...
- 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 ...
随机推荐
- SharpDevelop学习笔记(5)—— AddIns系统详解
在所有的插件被加载到指定的扩展点后,插件树就被创建完毕了, 但是,我们知道,插件树创建后,每个插件在插件树的位置在就固定的,但是,如果某些情况下,我们希望一些插件不可使用或应该隐藏起来, 或者说有的插 ...
- ctags and vim
1,源码目录下第归检索. ctags -R * 2,搜索tag并用vim打开: vim -t <tag> 3,在vim 下的一些操作: Keyboard command Action Ct ...
- strace命令使用
在调试的时候,strace能帮助你追踪到一个程序所执行的系统调用.当你想知道程序和操作系统如何交互的时候,这是极其方便的,比如你想知道执行了哪些系统调用,并且以何种顺序执行. 这个简单而又强大的工具几 ...
- MYSQL单双向同步
Master:192.168.1.101 Slave :192.168.1.102 单向同步(一) 进入Master启动MYSQL [root@localhost ~]# service mysql ...
- mysql 分组查询问题 group_concat
这几天在做购物车的时候.购物车内的商品为一个商品占一行,结果再从数据库读出的时候,没有分组,而是循环所有的内容出来,然后进行判断.如果一样的话就把他保存到一个变量中.但是自己逻辑没搞清楚.一直出bug ...
- Linux内核分析——理解进程调度时机跟踪分析进程调度与进程切换的过程
20135125陈智威 +原创作品转载请注明出处 +<Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 实验 ...
- SHUTDOWN_MSG: Shutting down NameNode at java.net.UnknownHostException: xxx
刚配置hadoop2.2,格式化namenode时候报的这个错. 原因是hadoop在格式化HDFS的时候,通过hostname命令获取到的主机名在/etc/hosts文件中进行映射的时候,没有找到, ...
- js单击自动选择文本
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/ ...
- JAVAWEB学习总结 HTTPSERVLETRESPONSE对象(二)
一.HttpServletResponse常见应用--生成验证码 1.1.生成随机图片用作验证码 生成图片主要用到了一个BufferedImage类 步骤: 1. 在内存中创建一张图片 2.得到图片 ...
- 安装Python2.7环境
1.下载并根据提示安装python_2.7.10_x64 2.将安装目录配置到环境变量path中 3.在命令后台中输入Python,出现下图中信息表示安装成功