如何解决DFS 迷宫求解器在正确时返回 false
我目前正在研究一个小型迷宫求解器项目,以更好地掌握深度优先搜索等算法。它的工作原理是将当前位置变为 2,然后检查其中一个位置(向上、向下、向左或向右),如果它是 0(路径),它将向前移动,直到它被单元格包围 1s(墙)然后它是一个死胡同,它回溯。
然而,我的迷宫求解器奇怪地一直返回 false,即使它已经找到了数字 3(结束)。所以我有两个问题,是什么导致它返回 false 以及可以在求解器中更改什么,以便只有最短路径的数字为 2(即,当它回溯时,它会将死胡同变成其他路径)?
提前致谢!
迷宫解算器
import java.util.ArrayList;
public class TestMazeDFS {
private static int[][] maze = {
{1,1,1},{1,3,};
public int[][] getMaze(){
return this.maze;
}
public static void main(String[] args) {
DFS dfs = new DFS(maze);
boolean test = dfs.solve(1,1);
System.out.println(test);
}
}
硬编码迷宫
{{1}}
打印时溶液的图像。 https://imgur.com/a/UqHP81o
解决方法
快速浏览告诉我你做错了:
maze[x][y] = 2;
// 3 is the cell the algorithm is supposed to find.
if (maze[x][y] == 3) { // <-- It will never be 3
return true;
}
同样在每个 if-check: if (x > 0 && maze[x-1][y] == 0 && solve (x-1,y) ) {
中,您只访问值为 0
的邻居。因此,出于显而易见的原因,您永远不会访问值为 3
的单元格。 if-check 应该类似于:if (x > 0 && (maze[x-1][y] == 0 || maze[x-1][y] == 3) && solve (x-1,y) ) {
并且请注意,在回溯时,您需要将状态恢复到原始状态。也就是说,当您返回 false 时,maze[x][y]
应该具有原始值。
也许试试这个?
public boolean solve(int x,int y) {
// 3 is the cell the algorithm is supposed to find.
if (maze[x][y] == 3) {
maze[x][y] = 2;
return true;
}
int orig = maze[x][y];
maze[x][y] = 2;
// Looks up.
if (x > 0 && (maze[x-1][y] == 0 || maze[x-1][y] == 3) && solve (x-1,y) ) {
//maze[x][y] = 2;
return true;
}
// Looks down
if (x < maze.length && (maze[x+1][y] == 0 || maze[x+1][y] == 3) && solve (x+1,y) ) {
//maze[x][y] = 2;
return true;
}
// Looks right.
if (y < maze.length && (maze[x][y+1] == 0 || maze[x][y+1] == 3) && solve (x,y+1) ) {
//maze[x][y] = 2;
return true;
}
// Looks left.
if (y > 0 && (maze[x][y-1] == 0 || maze[x][y-1] == 3) && solve (x,y-1) ) {
//maze[x][y] = 2;
return true;
}
maze[x][y] = orig;
return false;
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。