09-迷宫的其他函数
2.2.2 迷宫的其他函数
若有一个函数可在搜索过程中检查我们是否已抵达目标,将会便利很多。换句话说,我们需要检查搜索已到达的某个 MazeLocation 是否就是目标位置。于是可以为 Maze 添加一个方法。具体代码如代码清单2-14所示。
代码清单2-14 maze.py(续)
def goal_test(self, ml: MazeLocation) -> bool:
return ml == self.goal
怎样才能在迷宫内移动呢?假设我们每次可以从迷宫的给定单元格开始水平和垂直移动一格。根据此规则, successors() 函数可以从给定的 MazeLocation 找到可能到达的下一个位置。但是,每个 Maze 的 successors() 函数都会有所差别,因为每个 Maze 都有不同的尺寸和路障集。因此,代码清单2-15中把 successors() 函数定义为 Maze 的方法。
代码清单2-15 maze.py(续)
def successors(self, ml: MazeLocation) -> List[MazeLocation]:
locations: List[MazeLocation] = []
if ml.row + 1 < self._rows and self._grid[ml.row + 1][ml.column] != Cell.BLOCKED:
locations.append(MazeLocation(ml.row + 1, ml.column))
if ml.row - 1 >= 0 and self._grid[ml.row - 1][ml.column] != Cell.BLOCKED:
locations.append(MazeLocation(ml.row - 1, ml.column))
if ml.column + 1 < self._columns and self._grid[ml.row][ml.column + 1] != Cell.BLOCKED:
locations.append(MazeLocation(ml.row, ml.column + 1))
if ml.column - 1 >= 0 and self._grid[ml.row][ml.column - 1] != Cell.BLOCKED:
locations.append(MazeLocation(ml.row, ml.column - 1))
return locations
successors() 只是简单地检查 Maze 中 MazeLocation 的上方、下方、右侧和左侧,查看是否能找到从该位置过去的空白单元格。它还会避开检查 Maze 边缘之外的位置。每个找到的可达 MazeLocation 都会被放入一个列表,该列表将被最终返回给调用者。