返回首页

BFS:最短路径(无权图与网格)

一、面试常考点

1. 为什么 BFS 能求最短路

无权图每条边代价相同,按层扩展首次到达即最短。

2. 步数统计方式

按层循环,每层结束后步数 +1。

二、细节介绍

1. 网格 BFS

方向数组 + 越界判断 + 障碍判断。

2. 剪枝

已访问节点不重复入队。

三、示例代码

function shortestPathBinaryMatrix(grid) {
  const n = grid.length
  if (grid[0][0] === 1 || grid[n - 1][n - 1] === 1) return -1

  const dirs = [[1,0],[-1,0],[0,1],[0,-1],[1,1],[1,-1],[-1,1],[-1,-1]]
  const queue = [[0, 0, 1]]
  grid[0][0] = 1

  while (queue.length) {
    const [x, y, d] = queue.shift()
    if (x === n - 1 && y === n - 1) return d

    for (const [dx, dy] of dirs) {
      const nx = x + dx
      const ny = y + dy
      if (nx < 0 || ny < 0 || nx >= n || ny >= n) continue
      if (grid[nx][ny] !== 0) continue
      grid[nx][ny] = 1
      queue.push([nx, ny, d + 1])
    }
  }

  return -1
}

四、常用应用场景

1. 路由跳数

最少中转次数计算。

2. 迷宫类问题

最短步数寻路。