返回
广度优先搜索:简单快速的迷宫寻路算法
前端
2024-01-13 03:54:38
- 广度优先搜索的本质
广度优先搜索(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. 结语
广度优先搜索算法是一种非常简单且高效的迷宫寻路算法,它总能找到最短路径。在实际应用中,广度优先搜索算法可以用于解决各种各样的问题,如地图导航、网络路由和游戏人工智能等。