私はこの種の問題について助けが必要です。私はNxNバイナリ行列を解くために再帰を使いたい。問題は私の再帰の実装がどうにかして正しくないと思うことです。この問題では、私は右と下だけに行くことが許されています。私はissafe()メソッドをチェックして、すべてがtrueまたはfalseを1 = trueおよび0 = falseに従って返すように見えます。実行プログラムを実行すると何も表示されません。どんな助けでも本当に感謝しています。 solveMaze
にあなたの最初の呼び出しでJavaで再帰(2回の訂正)を使用して迷路を解く
public class Main {
public static void main(String[] args) {
int maze[][] = {{1, 0, 0, 0},
{1, 1, 0, 1},
{0, 1, 0, 0},
{1, 1, 1, 2}
};
Maze rat = new Maze();
rat.solveMaze(maze, 0, 0);
}
}
public class Maze {
int maze[][];
int mazeSize;
int EXIT=2;
public Maze() {
mazeSize=4;
maze = new int[mazeSize][mazeSize];
}
// check is its safe to traverse
public Boolean isSafe(int x, int y, int maze[][]){
if (x>=0 && x<mazeSize && y>=0 && y<mazeSize && maze[x][y]==1){
return true;
}
else return false;
}
boolean solveMaze(int maze[][],int x,int y){
int solmaze[][]= { {0, 0, 0, 0},
{0, 0, 0, 0},
{0, 0, 0, 0},
{0, 0, 0, 0}};
if(maze[x][y]==EXIT){
solmaze[x][y]=1;
printmaze(solmaze);
return true;
}
if(isSafe(x, y,maze) && maze[x][y]==1){
solmaze[x][y]=1;
return true;
}
if(isSafe(x, y,maze)==true && solveMaze(maze,x+1,y)==true){// down
solmaze[x][y]=1;
}
if(isSafe(x, y,maze)==true && solveMaze(maze,x,y+1)==true){//right
solmaze[x][y]=1;
}
solmaze[x][y]=0;
return false;
}
void printmaze(int maze[][]){//print maze
for(int i=0;i<maze.length;i++){
for(int j=0;j<maze.length;j++){
System.out.print(maze[i][j]);
}
System.out.println();
}
}
}
最初のifステートメントは、行列を返すベースケースとします。 printmazeメソッドをコメントアウトすると、終了点に達した場合は何も表示されません。 – user3500147
そのため、解決迷路が常に印刷されることを保証する別のメソッド、solveAndPrintMazeを使用しました。 –
ありがとう。私のprintmazeメソッドが適用されない理由を説明してください。 – user3500147