题目: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(迷宫+剪枝)相关推荐

  1. HDU1010 Tempter of the Bone DFS+剪枝

    点击打开链接 Tempter of the Bone Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Ja ...

  2. HDU1010:Tempter of the Bone(dfs+剪枝)

    http://acm.hdu.edu.cn/showproblem.php?pid=1010   //题目链接 http://ycool.com/post/ymsvd2s//一个很好理解剪枝思想的博客 ...

  3. HDU 1010 Tempter of the Bone heuristic 剪枝法

    本题就是考剪枝法了. 应该说是比较高级的应用了.因为要使用heuristic(经验)剪枝法.要总结出这个经验规律来,不容易.我说这是高级的应用也因为网上太多解题报告都没有分析好这题,给出的程序也很慢, ...

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

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

  6. 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): 在 ...

  7. HDOJ 1010 HDU 1010 Tempter of the Bone ACM 1010 IN HDU

    MiYu原创, 转帖请注明 : 转载自 ______________白白の屋 题目地址: http://acm.hdu.edu.cn/showproblem.php?pid=1010 题目描述: 代码 ...

  8. HDU.1010 Tempter of the Bone

    文章目录 一.题目解读 1.原题 2.分类 3.题意 4.输入输出格式 5.数据范围 二.题解参考 1.总体思路 2.思路① (1).分析 (2).AC代码 三.评价与后话 1.评价 2.奇偶剪枝0- ...

  9. HDU1010 Tempter of the Bone(DFS奇偶剪枝)

    传送门 Problem Description The doggie found a bone in an ancient maze, which fascinated him a lot. Howe ...

最新文章

  1. 知乎千万级高性能长连接网关是如何搭建的
  2. 每日一皮:昨晚梦见男朋友和别的女人在逛街,梦里我的第一反应就是查源代码......
  3. python恶搞小程序-抖音最火的整蛊表白小程序如何做出来的?教你用python做出
  4. oracle如何复制dept,[oracle]表复制的sql语句
  5. EntityFramework附加实体
  6. insert into 多张表_麦克维尔直流变频多联机弹簧阻尼减震器_淞江集团-李工
  7. codeforces Free Cash
  8. 大数据开发笔记(九):Flink综合学习
  9. html 制作用户注册页面模板,注册登录页面模板
  10. 用CSS3画出一个正方体
  11. python中heapq的库是什么_详解Python中heapq模块的用法
  12. VC浏览器相关的学习(五)(在BHO中建立对话框)--解决CreateDialog的1813错误
  13. 北京某牧场管理企业——牧场智慧管理项目
  14. 计算机组成原理——存储地址与边界对齐
  15. ITIL运维服务管理的26个流程的密切关系说明
  16. MFC CPropertySheet 多页面切换 事例
  17. Nexus7平板电脑重置后跳过联网验证方法
  18. 文件操作函数在VFS层的实现
  19. 面试题:java GC是在什么时候,对什么东西,做了什么事情?
  20. Mac 压缩软件Keka

热门文章

  1. 洛谷P2181对角线题解(C语言)
  2. RecyclerView——自动滚动效果
  3. 华为诺亚北大提出新视觉 MLP 架构,性能超越Swin (附代码下载)
  4. 酷炫打印耳机 专为你定制
  5. 百度超级链AI系列创世藏品明日发售!
  6. 公寓家上线新版APP,颠覆传统租房体验
  7. CSS字体属性之字体大小
  8. Mysql8.0安装教程
  9. 【论文笔记】基于U-Net的医学图像分割模型nnU-Net(no-new U-Net)
  10. 安卓定位方案的价格对比(包含可免费商用的服务)