用数组实现路径搜索需将地图建模为二维数组,0表示可通过、1表示障碍;bfs适用于等权最短路径,通过队列逐层探索相邻格子,并校验边界与障碍。
用数组实现路径搜索,核心是把地图建模为二维数组,每个元素代表一个可通行或不可通行的格子;避开障碍物的关键在于搜索过程中跳过标记为障碍的数组位置。
用二维数组表示地图与障碍物
把实际场景(比如机器人移动区域、游戏地图)抽象成行和列组成的网格。数组的每个元素存储状态:0 表示空地(可通过),1 表示障碍物(不可通过),也可用其他数值或布尔值区分。
例如:
grid = [ [0, 1, 0, 0], [0, 1, 0, 1], [0, 0, 0, 0], [1, 0, 1, 0] ]
其中 grid[1][1] = 1,表示第2行第2列是障碍,搜索时必须绕开。
选择适合的搜索算法:BFS 更适合找最短无权路径
当每一步代价相同(如只能上下左右移动一格),广度优先搜索(BFS)天然保证首次到达终点即为最短路径。它天然适配数组索引操作,且易于判断越界和障碍。
- 用队列保存待探索的位置(如 Python 的 deque 或列表模拟)
- 每次从队列取出一个坐标 (r, c),检查其四个相邻格子(r±1, c)、(r, c±1)
- 对每个邻居,先验证是否在数组范围内(0 ≤ r
- 用额外的 visited 数组或直接修改原数组(谨慎)记录已访问位置,避免重复入队
动态避开“变量障碍物”:运行时更新障碍状态
所谓“变量障碍物”,指障碍位置不是静态的,可能随时间变化(如移动的敌人、临时封锁区域)。此时不能只初始化一次 grid,而需在每次搜索前或每步扩展时重新确认障碍状态。
- 将障碍物位置维护在独立集合中(如 set of tuples),如 obstacles = {(1,1), (3,0)}
- 在 BFS 的邻居检查环节,不只查 grid[r][c] == 0,还要确认 (r, c) not in obstacles
- 若障碍物按帧/周期更新,可在每次调用搜索函数前刷新 obstacles 集合(例如根据物理引擎结果或传感器数据)
- 注意:频繁修改 obstacles 是轻量操作;避免在 BFS 循环内反复遍历障碍列表——用 set 成员检查是 O(1)
实战小技巧:路径还原与边界防护
找到终点后,通常需要返回完整路径。建议在 BFS 中用 parent 字典记录每个位置的前驱坐标,从终点反向追溯到起点。
常见易错点提醒:
- 忘记检查数组边界导致索引错误 —— 所有邻居坐标必须显式校验范围
- 把障碍物坐标写反(行列顺序混淆) —— 统一使用 grid[row][col],并保持所有坐标操作一致
- 未清除 visited 状态导致多轮搜索失败 —— 每次新搜索应新建 visited 集合或重置标记数组
- 将“不可达”误判为“逻辑错误” —— 先用简单地图(如全0)测试 BFS 基础流程,再逐步加入障碍










