これがインスタンス化され、メソッド 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 に等しいので、すべてが停止するのではないでしょうか?