我希望通过一点点谷歌搜索后回溯来解决迷宫问题!我看到这个算法: Recursion: Solving a Maze
这里是:
FIND-PATH(x,y)
if(x,y outside maze)返回false
if(x,y is goal)return true
如果(x,y未打开)返回false
将x,y标记为解决方案路径的一部分
if(FIND-PATH(x,y之前)== true)返回true
if(FIND-PATH(东方x,y)== true)返回true
if(FIND-PATH(x,y以南)== true)返回true
if(FIND-PATH(西x,y)== true)返回true
取消标记x,y作为解决方案路径的一部分
返回false
我尝试正确实现它,如下所示:
public class main {
public static void main(String[] args) {
// A as a Start and B is finish Line
char maze[][] = {
{ '#', '#', '#', '#', '#', '#', '#', '#', '#', '#' },
{ '#', 'A', ' ', ' ', '#', ' ', '#', ' ', ' ', '#' },
{ '#', ' ', ' ', ' ', '#', ' ', '#', ' ', '#', '#' },
{ '#', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', '#' },
{ '#', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', '#' },
{ '#', '#', '#', ' ', ' ', ' ', ' ', ' ', ' ', '#' },
{ '#', ' ', ' ', ' ', ' ', '#', '#', '#', '#', '#' },
{ '#', ' ', ' ', ' ', ' ', ' ', '#', ' ', '#', '#' },
{ '#', 'B', '#', ' ', ' ', ' ', ' ', ' ', ' ', '#' },
{ '#', '#', '#', '#', '#', '#', '#', '#', '#', '#' }
};
for (int i = 0; i < maze.length; i++) {
System.out.println(maze[i]);
}
mazeTraversal(maze, 1, 1);
}
static boolean mazeTraversal(char m[][], int i, int j) {
if (m[i][j] == '#')
return false;
if (m[i][j] == 'B')
return true;
// marking as a part of path
m[i][j] = '*';
//north
if ((mazeTraversal(m, i , j - 1)) == true) {
return true;
}
//east
if ((mazeTraversal(m, i + 1 , j)) == true) {
return true;
}
//south
if ((mazeTraversal(m, i , j + 1)) == true) {
return true;
}
//west
if ((mazeTraversal(m, i - 1, j)) == true) {
return true;
}
m[i][j] = ' ';
return false;
}
}
这是控制台错误:(堆栈溢出)!
Exception in thread "main" java.lang.StackOverflowError
at main.mazeTraversal(main.java:35)
at main.mazeTraversal(main.java:35)
at main.mazeTraversal(main.java:43)
at main.mazeTraversal(main.java:35)
at main.mazeTraversal(main.java:43)
at main.mazeTraversal(main.java:35)
at main.mazeTraversal(main.java:43)
at main.mazeTraversal(main.java:35)
at main.mazeTraversal(main.java:43)
at main.mazeTraversal(main.java:35)
at main.mazeTraversal(main.java:43)
at main.mazeTraversal(main.java:35)
at main.mazeTraversal(main.java:43)
at main.mazeTraversal(main.java:35)
at main.mazeTraversal(main.java:43)
at main.mazeTraversal(main.java:35)
我也做了几次追踪,我发现它陷入了循环,它永远不会走得更远...... 是我的代码错了还是算法错了?
答案 0 :(得分:4)
空方框是一个不包含#
或*
的正方形,您只需检查#
。
*
检查不需要以无限递归结束(即以与刚刚相同的方式返回)
将代码更改为;
static boolean mazeTraversal(char m[][], int i, int j) {
if (m[i][j] == '#')
return false;
if (m[i][j] == 'B')
return true;
if (m[i][j] == '*') // <-- added check
return false;
// marking as a part of path
...
...并在运行求解器后打印结果;
##########
#A # # #
# # # ##
# #
# #
### #
# #####
# # ##
#B# #
##########
##########
#* # # #
#* # # ##
#* #
#*** #
###* #
#*** #####
#* # ##
#B# #
##########
......看起来像你正在尝试做的事情。
答案 1 :(得分:2)
你进入了一个无限循环。您应该检查您是否已回到已经成为路径一部分的单元格中:
if(m[i][j]=='*')
return false;