再帰を使って迷路を解こうとしています。宣言されてい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
セルの一部にno がない場合は value を持ち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;
}
将来、どんな体にも役立つかもしれません。