2017-12-27 20 views
-2

私はこの種の問題について助けが必要です。私は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(); 
     } 
    } 

} 

答えて

1

私は、これはあなたが探しているソリューションであると信じています:

public class Main2 { 

    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.solveAndPrintMaze(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; 
    } 

    int solmaze[][]= { 
      {0, 0, 0, 0}, 
      {0, 0, 0, 0}, 
      {0, 0, 0, 0}, 
      {0, 0, 0, 0}}; 

    boolean solveMaze(int maze[][],int x,int y){ 

     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+1, y,maze)==true && solveMaze(maze,x+1,y)==true){// down 

      solmaze[x][y]=1; 
      return true; 
     } 

     if(isSafe(x, y+1,maze)==true && solveMaze(maze,x,y+1)==true){//right 

      solmaze[x][y]=1; 
      return true; 
     } 

     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(); 
     } 
    } 

    void solveAndPrintMaze(int maze[][],int x,int y) { 
     solveMaze(maze, x, y); 
     printmaze(solmaze); 
    } 
} 
+0

最初のifステートメントは、行列を返すベースケースとします。 printmazeメソッドをコメントアウトすると、終了点に達した場合は何も表示されません。 – user3500147

+0

そのため、解決迷路が常に印刷されることを保証する別のメソッド、solveAndPrintMazeを使用しました。 –

+0

ありがとう。私のprintmazeメソッドが適用されない理由を説明してください。 – user3500147

0

、二ifは、あなたが何かを印刷せずにtrueを返します((0,0)が存在し1がある&安全である)が真です。

これが何を意図しているのかを説明すれば、それを解決するのに役立つかもしれません。

+0

私は再帰を使用して行列を横断しようとしています。迷路の問題ラットのように – user3500147

+0

良いですが、私が特定した 'if'ステートメントのため再帰には決して行きません。 –

0

ここで実際に再帰を試みているわけではありません。試行している方法で再帰を開始するには、solveMazeメソッドをその内部から呼び出さなければなりません。

私はそれについて間違っていました。正解は以下のスコットによって与えられます。

+0

私はここでそれを呼び出した場合(isSafe(X、Y、迷路)==真&& solveMaze(迷路、X + 1、Y)== TRUE){//ダウン \t \t \t \t \t \t solmaze [X] [y] = 1; \t \t} – user3500147

関連する問題