HDOJ-ACM1010(JAVA) 奇偶剪枝法 迷宫搜索
转载声明:原文转自: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) 奇偶剪枝法 迷宫搜索的更多相关文章
- hdu 1010(迷宫搜索,奇偶剪枝)
传送门: http://acm.hdu.edu.cn/showproblem.php?pid=1010 Tempter of the Bone Time Limit: 2000/1000 MS (Ja ...
- 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 ...
- HDU 1010 (DFS搜索+奇偶剪枝)
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1010 题目大意:给定起点和终点,问刚好在t步时能否到达终点. 解题思路: 4个剪枝. ①dep&g ...
- 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 ...
- DFS中的奇偶剪枝(技巧)
剪枝是什么,简单的说就是把不可行的一些情况剪掉,例如走迷宫时运用回溯法,遇到死胡同时回溯,造成程序运行时间长.剪枝的概念,其实就跟走迷宫避开死胡同差不多.若我们把搜索的过程看成是对一棵树的遍历,那么剪 ...
- 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 ...
- Tempter of the Bone(dfs奇偶剪枝)
Tempter of the Bone Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Othe ...
- hdoj1010 奇偶剪枝+DFS
Tempter of the Bone Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Othe ...
随机推荐
- 微信获取用户的openid和详细信息
获取用户的信息的原理,首先用户会点击一个url,这个url会包含一个参数redirect_uri,这个url是指向微信那边的服务器的,然后微信会把这个http请求重定向到redirect_uri,即我 ...
- C语言自带的快速排序(qsort)函数使用方法
感觉打快排太慢了,找到了c语言自带的函数.这函数用起来没c++的方便,不过也够了. 函数名称:qsort,在头文件:<stdlib.h>中 不多说,上代码: #include <st ...
- This transaction has been rolled back, rather than only the current.
今天上午,收到运维组同事反映某应用系统的其中一个功能报错,不是偶然性事件,每个使用该功能的用户都报错.报错内容为:This transaction has been rolled back, rath ...
- C#.net调用axis2webService
用C#.net调用axis2webService的时候需要引用web服务, 比如访问地址为:http://111.21.32.213:8080/axis2/services/AdService/get ...
- 用jQuery在IFRAME里取得父窗口的某个元素的值
收集网上的一些示例: 用jQuery在IFRAME里取得父窗口的某个元素的值 只好用DOM方法与jquery方法结合的方式实现了 1.在父窗口中操作 选中IFRAME中的所有单选钮 $(window. ...
- Wp8开发环境搭建总结
原地址:http://blog.csdn.net/lixing732100721/article/details/8564985 注意:技术发展太快 此文章年代已久 请大家酌情参照 系统要求(来自 ...
- Ubuntu下APACHE HTTPS安装和配置
http://blog.csdn.net/newjueqi/article/details/9789659
- 把硬盘格式化成ext格式的cpu占用率就下来了
把硬盘格式化成ext格式的cpu占用率就下来了我是使用ext4格式 @Paulz 还有这种事情? 现在是什么格式?- - ,你自己用top命令看一下啊就知道什么东西在占用cpu了下载软件一半cpu都用 ...
- trash目录: ~/.local/share/Trash
trash目录:~/.local/share/Trash
- [Hadoop源码解读](六)MapReduce篇之MapTask类
MapTask类继承于Task类,它最主要的方法就是run(),用来执行这个Map任务. run()首先设置一个TaskReporter并启动,然后调用JobConf的getUseNewAPI()判断 ...