转载声明:原文转自:http://www.cnblogs.com/xiezie/p/5568822.html

第一次遇到迷宫搜索,给我的感觉是十分惊喜的:搞懂这个的话,感觉自己又掌握了一项技能~

个人感觉,角色扮演类的游戏,起码都可以在迷宫搜索上找到影子。

奇偶剪枝这个算法感觉十分开阔的视野~这样去描述这个具体问题实在太形象生动了~

总而言之,十分有趣。

仔细的人会发现  每当设计到移动,我们必须想到上下左右,这也让我们看到这类算法的思路。

在学习迷宫搜索当中,我发现:这个搜索算法是先分析 找到结果时的情形,然后再将通路换为障碍,经过上下左右后,再换回通路。(这是递归写法该有的一种套路吗?才疏学浅,不敢妄言)

另外,迷宫搜索类的题目不仅涉及到 回溯法,还让人好奇迷宫生成的算法~

接下来,应该研究下 迷宫生成算法和迷宫搜索算法中提及的 深度、广度搜索!

不得不借鉴他人的成果:

下面是剪枝的简单理论,一看就懂:

把map看作

0 1 0 1 0 1
                             1 0 1 0 1 0
                             0 1 0 1 0 1
                             1 0 1 0 1 0
                             0 1 0 1 0 1

从 0->1 需要奇数步

从 0->0 需要偶数步

以下是JAVA实现代码:

import java.util.*;
import java.io.*; public class Main{ public static void main(String[] arg){
Scanner scan = new Scanner(new BufferedInputStream(System.in));
int n,m,t;
while((n=scan.nextInt())!=0&&(m=scan.nextInt())!=0&&(t=scan.nextInt())!=0){
ok = false;
int x = 0,y = 0;
int targetX = 0,targetY = 0;
char[][] map = new char[n][m];
for(int i = 0 ; i != n ; i ++ ){
String row = scan.next();
char[] c = row.toCharArray();
for(int j = 0 ; j != m ; j ++ ){
map[i][j]=c[j];
if(c[j]=='.'){
continue;
}
if(c[j]=='X'){
continue;
}
if(c[j]=='S'){
x = i;
y = j;
continue;
}
if(c[j]=='D'){
targetX = i;
targetY = j;
}
}
}
//剪枝
if((targetX+targetY)%2==(x+y)%2){//相同
if(t%2==1){
t=-1;
}
}else{
if(t%2==0){//相异
t=-1;
}
}
findPath(map,x,y,t,targetX,targetY);
if(t==-1){
System.out.println("NO");
continue;
}
if(ok){
System.out.println("YES");
}else{
System.out.println("NO");
}
}
scan.close();
} static boolean ok = false; static void findPath(char[][] map,int i , int j,int t,int targetX,int targetY){
if(ok||t==-1){
return;
}
if(t==0&&(map[i][j]=='D'||i==targetX&&j==targetY)){
ok = true;
return;
}
map[i][j] = 'X';
//上
if(j - 1!=-1&& map[i][j-1]!='X'){
findPath(map,i,j-1,t-1,targetX,targetY);
}
//下
if(j + 1!=map[0].length&&map[i][j + 1]!='X' ){
findPath(map,i,j+1,t-1,targetX,targetY);
}
//左
if(i - 1!=-1&&map[i-1][j]!='X'){
findPath(map,i-1,j,t-1,targetX,targetY);
}
//右
if(i + 1!=map.length&&map[i+1][j ]!='X' ){
findPath(map,i+1,j,t-1,targetX,targetY);
}
map[i][j] = '.';
} }

HDOJ-ACM1010(JAVA) 奇偶剪枝法 迷宫搜索的更多相关文章

  1. hdu 1010(迷宫搜索,奇偶剪枝)

    传送门: http://acm.hdu.edu.cn/showproblem.php?pid=1010 Tempter of the Bone Time Limit: 2000/1000 MS (Ja ...

  2. hdoj 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 (DFS搜索+奇偶剪枝)

    题目链接:  http://acm.hdu.edu.cn/showproblem.php?pid=1010 题目大意:给定起点和终点,问刚好在t步时能否到达终点. 解题思路: 4个剪枝. ①dep&g ...

  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. DFS中的奇偶剪枝(技巧)

    剪枝是什么,简单的说就是把不可行的一些情况剪掉,例如走迷宫时运用回溯法,遇到死胡同时回溯,造成程序运行时间长.剪枝的概念,其实就跟走迷宫避开死胡同差不多.若我们把搜索的过程看成是对一棵树的遍历,那么剪 ...

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

  8. Tempter of the Bone(dfs奇偶剪枝)

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

  9. hdoj1010 奇偶剪枝+DFS

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

随机推荐

  1. Apache服务器部署ASP.NET网站

    资源罗列: apache如何支持asp.net 用 Apache 发布 ASP.NET 网站

  2. [转载]C#读取Excel几种方法的体会

    C#读取Excel几种方法的体会 转载地址:http://developer.51cto.com/art/201302/380622.htm (1) OleDb: 用这种方法读取Excel速度还是非常 ...

  3. 自动寻路NavMesh

    步骤 1.创建地形 2.添加角色 3.创建多个障碍物,尽量摆放的复杂些,用来检测NavMesh的可用性和效率 4.选中地形,在Navigation窗口中,设置Navigation Static 5.依 ...

  4. 长达半年的苹果发布会:亮点与槽点(iPhone5s,iPhone5c)

    不知出于什么原因,今天凌晨召开的苹果发布会并没有视频直播,所以大家都守着The Verge家的图文直播.结果,苹果再一次用事实证明了他们没有保密体系,或者,故意没有保密体系. 整场发布会正经的亮点如下 ...

  5. 视图--bai

    /*视图的必要性 create view population_all_view as select xxxx 详细信息 from qgck where rownum<500 -- sql语句不 ...

  6. 正则表达式的秘籍-b

    一. 正则表达式和其他方法的比较 1.我们一般将谓词和正则表达式配合使用,这是最常用的方法. - (BOOL)validateNumber:(NSString *) textString {     ...

  7. 事件分发&响应链

    iOS的三种事件:触摸事件/运动事件/远程控制事件 typedef enum { UIEventTypeTouches, UIEventTypeMotion, UIEventTypeRemoteCon ...

  8. Decision Boundaries for Deep Learning and other Machine Learning classifiers

    Decision Boundaries for Deep Learning and other Machine Learning classifiers H2O, one of the leading ...

  9. hdu 3715

    一个很简单的2-sat的题: 不过比较难想到: 其实也不是很难,可能接触的少了吧! #include<cstdio> #include<vector> #define maxn ...

  10. C#读取Excel五种方式的体会

    原地址: http://blog.csdn.net/dapengbusi/article/details/38117817 http://blog.csdn.net/dapengbusi/articl ...