BFS(广度优先搜索)是解决无权图或边权相同图最短路径问题的首选算法。它的核心在于层序遍历,确保第一次到达目标节点时的路径一定是最短的。下面通过四个经典 LeetCode 案例,演示 BFS 在不同场景下的应用与实现细节。
1. 迷宫中离入口最近的出口
问题场景:给定一个字符矩阵,. 表示路,+ 表示墙。从指定起点出发,上下左右移动,求到达边界的最短步数。起点本身不算出口。
核心思路:这是一个典型的网格 BFS。我们需要维护一个队列来存储当前层的坐标,同时使用标记数组避免重复访问。每处理完一层,步数加一。一旦某个邻居坐标落在边界上且不是墙,即可返回当前步数。
参考实现:
import java.util.*;
class Solution {
int[] dx = {1, -1, 0, 0};
int[] dy = {0, 0, 1, -1};
boolean[][] flag;
int m, n;
public int nearestExit(char[][] maze, int[] entrance) {
m = maze.length;
n = maze[0].length;
flag = new boolean[m][n];
// 初始化墙壁标记
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
if (maze[i][j] == '+') {
flag[i][j] = true;
}
}
}
Queue<int[]> queue = new LinkedList<>();
queue.add( []{entrance[], entrance[]});
flag[entrance[]][entrance[]] = ;
;
(!queue.isEmpty()) {
length++;
queue.size();
( ; i < size; i++) {
[] arr = queue.poll();
( ; j < ; j++) {
dx[j] + arr[];
dy[j] + arr[];
(x >= && x < m && y >= && y < n
&& maze[x][y] == && !flag[x][y]) {
(x == || x == m - || y == || y == n - ) {
length;
}
queue.add( []{x, y});
flag[x][y] = ;
}
}
}
}
-;
}
}


