一旦实例化并调用方法遍历(0,0),它将自动解决迷宫,其中7表示路径,3表示“尝试路径”。 我正在尝试理解这段代码,但我仍然陷入了遍历方法中的 first 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)的意思在哪里和什么意思,我的意思是当迷宫完全解决时只做等于true,如果有效,完成将等于true,那么整个事情不会停止吗?
答案 0 :(得分:2)
这是你的方法:
public boolean traverse (int row, int column)
{
boolean done = false;
if (valid (row, column))
{
...
}
return done;
}
因此,如果该点无效,它将跳过所有测试并返回false
。
答案 1 :(得分:0)
如果有效测试失败,则执行的下一步是“返回完成”;在方法的最后,它将返回false。这会将有关失败的信息传递给调用者。
答案 2 :(得分:0)
在第一个检查行和列的有效性。如果行和列无效,则该方法不会立即停止,因为基于完成字段的值,将执行第一个else中的嵌套if块。