返回

广度优先搜索:简单快速的迷宫寻路算法

前端

  1. 广度优先搜索的本质

广度优先搜索(BFS)算法是一种非常简单且高效的迷宫寻路算法。它本质上是一个队列搜索算法。算法的核心思想是将所有的可能路径放在队列中,然后按照先进先出的原则依次探索每一条路径。广度优先搜索算法的优势在于,它总能找到最短路径。

2. 算法步骤

  • 1)创建一个队列,将起点添加到队列中

  • 2)创建一个数组或哈希表,用于记录已访问过的位置

  • 3)当队列不为空时,从队列的开头取出一个位置,将其标记为已访问过

  • 4)检查该位置周围的四个相邻位置(上、下、左、右),并将所有可以移动的位置添加到队列中

  • 5)重复步骤3和步骤4,直到队列为空或找到终点

3. JS 代码示例

// 迷宫数组,0表示可走,1表示障碍物
const maze = [
  [0, 0, 1, 0, 0],
  [0, 1, 0, 1, 0],
  [0, 1, 0, 0, 0],
  [0, 1, 1, 1, 0],
  [0, 0, 0, 0, 0]
];

// 起点和终点坐标
const start = { x: 0, y: 0 };
const end = { x: 4, y: 4 };

// 用于记录已访问过的位置
const visited = new Array(maze.length).fill(0).map(() => new Array(maze[0].length).fill(false));

// 创建队列,将起点添加到队列中
const queue = [start];

// 广度优先搜索算法
while (queue.length > 0) {
  // 从队列的开头取出一个位置
  const current = queue.shift();

  // 检查该位置周围的四个相邻位置
  const neighbors = [
    { x: current.x - 1, y: current.y }, // 上
    { x: current.x + 1, y: current.y }, // 下
    { x: current.x, y: current.y - 1 }, // 左
    { x: current.x, y: current.y + 1 }, // 右
  ];

  // 遍历相邻位置
  for (const neighbor of neighbors) {
    // 检查该位置是否合法(在迷宫范围内且不是障碍物)
    if (neighbor.x >= 0 && neighbor.x < maze.length && neighbor.y >= 0 && neighbor.y < maze[0].length && !maze[neighbor.x][neighbor.y] && !visited[neighbor.x][neighbor.y]) {
      // 将该位置添加到队列中
      queue.push(neighbor);

      // 标记该位置为已访问过
      visited[neighbor.x][neighbor.y] = true;

      // 检查该位置是否为终点
      if (neighbor.x === end.x && neighbor.y === end.y) {
        // 找到终点,结束搜索
        return true;
      }
    }
  }
}

// 未找到终点,返回false
return false;

4. 结语

广度优先搜索算法是一种非常简单且高效的迷宫寻路算法,它总能找到最短路径。在实际应用中,广度优先搜索算法可以用于解决各种各样的问题,如地图导航、网络路由和游戏人工智能等。