java:使用回溯卡在循环中的迷宫解算器
我想通过回溯来解决迷宫,在谷歌搜索之后!我看到这个算法: 这是: 查找路径(x,y)java:使用回溯卡在循环中的迷宫解算器,java,backtracking,maze,Java,Backtracking,Maze,我想通过回溯来解决迷宫,在谷歌搜索之后!我看到这个算法: 这是: 查找路径(x,y) 如果(x,y在迷宫外)返回false 如果(x,y是目标)返回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
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;
}
}
我也做过几次跟踪,我看到它卡在一个循环中,再也无法继续下去。。。
是我的代码错了还是算法错了?开方是不包含
或*
的正方形,您只检查
*
检查要求不以无限递归结束(即返回与刚才相同的方式)
将代码更改为
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
...
…这看起来像是您要做的。开放正方形是不包含
或*
的正方形,您只检查
*
检查要求不以无限递归结束(即返回与刚才相同的方式)
将代码更改为
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
...
…这看起来像是你要做的。你进入了一个无限循环。您应该检查您是否返回到已经是路径一部分的单元格中:
if(m[i][j]=='*')
return false;
你进入了一个无限循环。您应该检查您是否返回到已经是路径一部分的单元格中:
if(m[i][j]=='*')
return false;
你在哪里做步骤3?实际上1,3是合并的。循环也发生在迷宫内部。我认为[3]只处理[1]这个特定的迷宫,因为你在迷宫的四面都有栅栏。你在哪里做步骤3?实际上1,3是合并的。循环也发生在迷宫内部。我认为[3]处理[1]只适用于这个特殊的迷宫,因为迷宫的四面都有栅栏。