import java.util.LinkedList;
import java.util.Queue;
public class Solution {
private static final int[][] dir = {{0, 1}, {1, 0}, {0, -1}, {-1, 0}};
public void bfs(char[][] grid, boolean[][] visited, int x, int y) {
int m = grid.length;
int n = grid[0].length;
Queue<int[]> queue = new LinkedList<>();
queue.add(new int[]{x, y});
visited[x][y] = true;
while (!queue.isEmpty()) {
int[] cur = queue.poll();
int curx = cur[0];
int cury = cur[1];
for (int i = 0; i < 4; i++) {
int nextx = curx + dir[i][0];
int nexty = cury + dir[i][1];
if (nextx >= 0 && nextx < m && nexty >= 0 && nexty < n && !visited[nextx][nexty]) {
queue.add(new int[]{nextx, nexty});
visited[nextx][nexty] = true;
}
}
}
}
}
这段代码实现了二维网格上的广度优先搜索(BFS)。以下是代码的详细解释:
1. **初始化:** 代码初始化了一个二维数组 `dir`,表示四个可能的移动方向:右、下、左和上。
2. **BFS 函数:** `bfs` 函数接受一个二维网格 (`char[][] grid`)、一个布尔数组 (`boolean[][] visited`) 以及起始坐标 (`int x, int y`)。它从给定坐标开始执行 BFS。
- 它初始化一个队列 (`Queue<int[]> queue`) 用于跟踪待访问的单元格。
- 使用 `queue` 存储当前正在处理的坐标,并将该坐标标记为已访问。
- 在一个 while 循环中,从队列中取出当前坐标,然后尝试在四个方向上移动。
- 如果下一个坐标在合法的范围内且未被访问过,将其添加到队列中并标记为已访问。
这段代码可以用于解决迷宫最短路径等问题,通过广度优先搜索遍历所有可能的路径,直到找到目标位置。