【hdoj_1010】Tempter of the Bone(迷宫+剪枝)
题目:http://acm.hdu.edu.cn/showproblem.php?pid=1010
题目大意:给出一个迷宫(含起点和终点),要求找出一条路径,这条路径的长度必须为某个规定的长度.
在做本题之前,先学习了一下迷宫问题:http://blog.csdn.net/ten_sory/article/details/66975811
在理解迷宫问题的基础上,再做本题.本题的难点就是剪枝的问题.如果只用一般的DFS+回溯的方法求解这个问题,一定会超时,所以需要一些剪枝技巧.
1.奇偶剪枝:如果当前位置为(x,y),终点为(dx,dy),要求你在T步内从(x,y)走到(dx,dy).剪枝就是确定是否存在在T步内完成(x,y)到(dx,dy)的可能性.(x,y)——>(dx,dy)的最少步骤为abs(dx-x)+abs(dy-y),如下图,就是两点之间的曼哈顿距离.
当然,这个最短距离(设为path1)未必可以走得通,所以存在其他的路径.可以肯定的是,其他任意一条路径(设为path2)的长度一定和path1的长度的奇偶性是相同的.因为,path1和path2的起点和终点在纵轴一定相等,如果path2在纵轴上多走了一步,一定要在纵轴上往回走一步,只有这样,才能到达终点.同理,横轴也是一样.
根据这个结论,可以得出,(x,y)到(dx,dy)的最短路径的长度(步数),一定和所规定的步数的奇偶性相同.如果奇偶性不同,终止这条路径的探测.
2.小小剪枝:如果规定时间为T,而障碍物个数为wall个,则如果n*m-wall=可走的点的个数<=T,那么一定不存在某条可行路径的长度为T,终止即可.
代码如下:
#include<iostream>
using namespace std;int flag;
char maze[10][10];
int vis[10][10];
int n,m,T,t;
int sx,sy,dx,dy;int dir[4][2] = {{1,0},{0,1},{-1,0},{0,-1}};//4个方向int abs(int x){return x>0?x:(-x);}void dfs(int x,int y,int t)
{if(x==dx && y==dy && t==T)//到达终点{flag = 1;return;}if(x<0 || x>=n || y<0 || y>=m)//出界return;/*奇偶剪枝*/int temp1 = abs(dx-x) + abs(dy-y);int temp2 = abs(T-t);//剩余时间int temp = abs(temp1-temp2);if(temp%2!=0)return;//以当前位置(x,y)位置为起点,从上,下,左,右4个方向探测for(int i=0;i<4;i++){int nx = x + dir[i][0];int ny = y + dir[i][1];//获取新坐标(nx,ny)if(0<=nx && nx<n && 0<=ny && ny<m)//(nx,ny)没有出界{if(maze[nx][ny]!='X' && vis[nx][ny]==0)//位置(nx,ny)不是障碍,而且没有被访问过{ vis[nx][ny] = 1;//设置(nx,ny)为[访问过]状态dfs(nx,ny,t+1);//以(nx,ny)为起点,进行下一步探测,步数+1if(flag) return;//*****这里下面重点说明vis[nx][ny] = 0;//回溯}}}
}int main()
{//freopen("in.txt","r",stdin);while(1){scanf("%d%d%d",&n,&m,&T);if(!n && !m && !T)break;int wall=0;for(int i=0;i<n;i++){cin >> maze[i];for(int j=0;j<m;j++){vis[i][j] = 0;if(maze[i][j]=='X') wall ++;else if(maze[i][j]=='S') sx=i,sy=j,vis[i][j]=1;else if(maze[i][j]=='D') dx=i,dy=j;}}if(n*m-wall<=T)//剪枝,可以节省一点时间{printf("NO\n");continue;}t = 0;flag = 0;dfs(sx,sy,t);if(flag)printf("YES\n");elseprintf("NO\n");}return 0;
}
一个关于递归和回溯法的说明:
递归+回溯法中,如果一个探测return了,只是本次递归结束了,之后回溯,进行下一次递归.所以某次递归的return不代表整个递归函数的return.
本题中,只要某次递归找到一个符合要求的路径,就结束整个函数,而不仅仅是结束此次递归.
所以,本题在回溯之前,需要判断一下是否已经找到了符合要求的路径,即:在dfs(...)之后,立即判断if(flag) return;
本文剪枝策略参考:http://www.cnblogs.com/grubbyskyer/p/3855533.html
【hdoj_1010】Tempter of the Bone(迷宫+剪枝)相关推荐
- HDU1010 Tempter of the Bone DFS+剪枝
点击打开链接 Tempter of the Bone Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Ja ...
- HDU1010:Tempter of the Bone(dfs+剪枝)
http://acm.hdu.edu.cn/showproblem.php?pid=1010 //题目链接 http://ycool.com/post/ymsvd2s//一个很好理解剪枝思想的博客 ...
- HDU 1010 Tempter of the Bone heuristic 剪枝法
本题就是考剪枝法了. 应该说是比较高级的应用了.因为要使用heuristic(经验)剪枝法.要总结出这个经验规律来,不容易.我说这是高级的应用也因为网上太多解题报告都没有分析好这题,给出的程序也很慢, ...
- 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
1) 题目 Tempter of the Bone Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (J ...
- hdu1010 Tempter of the Bone
转载自:http://acm.hdu.edu.cn/forum/read.php?tid=6158 sample input: 4 4 5 S.X. ..X. ..XD .... 问题: (1): 在 ...
- HDOJ 1010 HDU 1010 Tempter of the Bone ACM 1010 IN HDU
MiYu原创, 转帖请注明 : 转载自 ______________白白の屋 题目地址: http://acm.hdu.edu.cn/showproblem.php?pid=1010 题目描述: 代码 ...
- HDU.1010 Tempter of the Bone
文章目录 一.题目解读 1.原题 2.分类 3.题意 4.输入输出格式 5.数据范围 二.题解参考 1.总体思路 2.思路① (1).分析 (2).AC代码 三.评价与后话 1.评价 2.奇偶剪枝0- ...
- HDU1010 Tempter of the Bone(DFS奇偶剪枝)
传送门 Problem Description The doggie found a bone in an ancient maze, which fascinated him a lot. Howe ...
最新文章
- 知乎千万级高性能长连接网关是如何搭建的
- 每日一皮:昨晚梦见男朋友和别的女人在逛街,梦里我的第一反应就是查源代码......
- python恶搞小程序-抖音最火的整蛊表白小程序如何做出来的?教你用python做出
- oracle如何复制dept,[oracle]表复制的sql语句
- EntityFramework附加实体
- insert into 多张表_麦克维尔直流变频多联机弹簧阻尼减震器_淞江集团-李工
- codeforces Free Cash
- 大数据开发笔记(九):Flink综合学习
- html 制作用户注册页面模板,注册登录页面模板
- 用CSS3画出一个正方体
- python中heapq的库是什么_详解Python中heapq模块的用法
- VC浏览器相关的学习(五)(在BHO中建立对话框)--解决CreateDialog的1813错误
- 北京某牧场管理企业——牧场智慧管理项目
- 计算机组成原理——存储地址与边界对齐
- ITIL运维服务管理的26个流程的密切关系说明
- MFC CPropertySheet 多页面切换 事例
- Nexus7平板电脑重置后跳过联网验证方法
- 文件操作函数在VFS层的实现
- 面试题:java GC是在什么时候,对什么东西,做了什么事情?
- Mac 压缩软件Keka