转载声明:原文转自: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. Oracle的rowid结构解析

    SQL> select rowid,deptno from dept; ROWID                  DEPTNO ------------------ ---------- A ...

  2. 一步步学习NHibernate(5)——多对一,一对多,懒加载(2)

    请注明转载地址:http://www.cnblogs.com/arhat 通过上一章的学习,我们建立了Student和Clazz之间的关联属性,并从Student(many)的一方查看了Clazz的信 ...

  3. 回首Java(始)

    自接触Java开始,已然5载春秋. 如今每每在深入学习过程中,时刻感到力不从心. It's time!该拾起J2SE基石. 平地高楼,日积跬步.根底不坚实,如今才寸步维艰. 回头再温故.

  4. 精确到秒的JQuery日期控件

    项目中需要用到精确到秒的日期控件,到网上搜了一下,发现有一个JQuery控件可以实现该功能---TimerPicker.但是官网上没有提供该控件的完整Demo,而且没有提供汉化包,所以自己汉化了一下, ...

  5. What Can I Do With This Major?

    What Can I Do With This Major? Majors Don’t see your major? Accounting Advertising Africana Studies ...

  6. 转--Server “**” has shut down the connection prematurely一例分析

    近几天在性能测试过程中,发现loadrunner Controller经常报 Server “**” has shut down the connection prematurely .概率很高,现象 ...

  7. DHTMLX 前端框架 建立你的一个应用程序 教程(十)--保存表单中的数据

    保存表单中的数据 现在我们所要做的是 当用户点击提交按钮的时候  我们将表单中的数据进行保存操作. 我们可以使用dhtmlxDataProcessor. 来进行操作.它是一个数据组件,可以提供与服务器 ...

  8. 运行edX Devstack

    前一篇文章,我们安装完成了edX Devstack,本文将介绍edX Devstack的常用命令 6.1. 连接到 Devstack Virtual Machine 为了连接到Devstack vir ...

  9. tbr tbn tbc

    http://tech.bobgo.net/?m=201004 因为最近的工作需要从MP4视频中提取一些关键帧,要了解如何将视频的时间点转换为对应的帧号,所以查阅了一些关于视频编解码以及时间同步方式的 ...

  10. char和QChar(Unicode的编码与内存里的值还不是一回事)

    char类型是c/c++中内置的类型,描述了1个字节的内存信息的解析.比如: char gemfield=’g’; 那么在由gemfield标记的这块内存的大小就是1个字节,信息就是01100111, ...