Я пытаюсь решить лабиринт, используя рекурсию. Он объявлен Cell [][] maze
.
public class Cell {
private Wall left;
private Wall right;
private Wall up;
private Wall down;
private boolean end;
// Setters and getters not shown
}
Если для какой-либо стороны ячейки нет Wall
, то она имеет значение null
, иначе она относится к объекту Wall
. Wall
ссылки непротиворечивы: обе ячейки, примыкающие к одной стене, ссылаются на нее с соответствующими полями. Если стены нет, то в обеих соседних ячейках есть соответствующие записи null
. Вот поиск:
public boolean solveMaze(Cell[][] maze, int i, int j) {
if (maze[i][j].isEnd()){
System.out.println(maze[i][j].toString());
return true;
}
if (maze[i][j].getDown() == null) {
return solveMaze(maze, i, j + 1);
}
if (maze[i][j].getUp() == null) {
return solveMaze(maze, i, j - 1) ;
}
if (maze[i][j].getLeft() == null) {
return solveMaze(maze, i - 1, j);
}
if (maze[i][j].getRight() == null) {
return solveMaze(maze, i + 1, j) ;
}
return false;
}
Я получаю сообщение об ошибке Stack Overflow
. Что не так с моим условием остановки рекурсии?
Обновление:
С вашей высоко оцененной помощью я решил эту проблему: это правильное решение, которое работает безупречно:
public boolean solveMaze(Cell[][] maze, int i, int j){
if (maze[i][j].isEnd()){
System.out.println("Maze Exit :["+i+","+j+"]" );
return true;
}
if (maze[i][j].isVisited()){
return false;
}
maze[i][j].setVisited(true);
if ((maze[i][j].getButtom() == null) ){
if (solveMaze(maze,i,j+1)==true)
return true;
}
if ((maze[i][j].getUp() == null) ){
if ( solveMaze(maze,i,j-1) ==true )
return true;
}
if ((maze[i][j].getLeft() == null)){
if (solveMaze(maze,i-1,j))
return true;
}
if ((maze[i][j].getRight() == null)){
if (solveMaze(maze,i+1,j))
return true;
}
maze[i][j].setVisited(false);
return false;
}
может быть, это будет полезно для любого тела в будущем.