0

これがインスタンス化され、メソッド traverse(0,0) が呼び出されると、自動的に迷路が解かれ、7 がパスとして表示され、3 が「試行済みパス」として表示されます。このコードを理解しようとしていますが、traverse メソッドの最初の else ステートメントで行き詰まります。

public class Maze
{
    private final int TRIED = 3;
    private final int PATH = 7;
    private int[][] grid = { {1,1,1,0,1,1,0,0,0,1,1,1,1},
                             {1,0,1,1,1,0,1,1,1,1,0,0,1},
                             {0,0,0,0,1,0,1,0,1,0,1,0,0},
                             {1,1,1,0,1,1,1,0,1,0,1,1,1},
                             {1,0,1,0,0,0,0,1,1,1,0,0,1},
                             {1,0,1,1,1,1,1,1,0,1,1,1,1},
                             {1,0,0,0,0,0,0,0,0,0,0,0,0},
                             {1,1,1,1,1,1,1,1,1,1,1,1,1} };

public boolean traverse (int row, int column)
{
    boolean done = false;
    if (valid (row, column))
    {
       grid[row][column] = TRIED;
       // this cell has been tried
       if (row == grid.length-1 && column == grid[0].length-1)
          done = true;
          // the maze is solved
       else
       {
          done = traverse (row+1, column); 
          // down
          if (!done)
          done = traverse (row, column+1); 
          // right
          if (!done)
          done = traverse (row-1, column);
          // up

          if (!done)
          done = traverse (row, column-1);
          // left
       }
    if (done)
    // this location is part of the final path
    grid[row][column] = PATH;
    }
    return done;
}

//-----------------------------------------------------------------
//  Determines if a specific location is valid.
//-----------------------------------------------------------------
private boolean valid (int row, int column)
{
    boolean result = false;
    // check if cell is in the bounds of the matrix
    if (row >= 0 && row < grid.length && column >= 0 &&
       column < grid[row].length)
       // check if cell is not blocked and not previously tried
       if (grid[row][column] == 1)
       result = true;
       return result;
}

私の知る限り、

done = traverse (row+1, column); 

この行は再帰呼び出しであり、一度下に移動し、メソッドを再度実行しますが、有効でない場合はどうなりますか? メソッド全体が停止しませんか?特定のスポットが無効になった後、制御の流れがどこに移行するのかわかりません。

たとえば、[1][0] が有効でない場合、制御は [0][0] 呼び出しに戻り、「右に行く」ステートメントを処理しますか? if (!done) とはどこで、何を意味するのでしょうか。つまり、done は迷路が完全に解決された場合にのみ true に等しくなり、それが有効な場合、done は true に等しいので、すべてが停止するのではないでしょうか?

4

3 に答える 3

2

これがあなたの方法です:

public boolean traverse (int row, int column)
{
    boolean done = false;
    if (valid (row, column))
    {
       ...
    }
    return done;
}

したがって、ポイントが有効でない場合、すべてのテストをスキップして を返しfalseます。

于 2012-12-08T03:41:45.523 に答える
0

有効なテストが失敗した場合、次に実行するのは「return done;」です。メソッドの最後で false を返します。これにより、失敗に関する情報が呼び出し元に返されます。

于 2012-12-08T03:41:55.737 に答える
0

それ以外の場合は、最初に行と列の有効性がチェックされます。行と列が有効でない場合、メソッドは即座に停止しません。これは、done フィールドの値に基づいて、最初の else 内のネストされた if ブロックが実行されるためです。

于 2012-12-08T03:43:53.437 に答える