单源广度优先搜索
单源广度优先搜索
适用场景:
1 两点间能否抵达
2 两点间最短路径
从开始点开始按层搜索,每一层都将当前所有可达的点纳入数组,检查是否抵达终点,不是则依据纳入数组的点开始寻找所有能够抵达的点。层数就是最短的步数。如果需要记录足迹,可以使用数组模拟队列front和rear为头尾指针,再用递归模拟栈打印。或者使用引用记录上一步的节点。
import java.util.LinkedList;
import java.util.Queue;
public class BFS {
private final int[] dx = new int[]{-1, 0, 1, 0};
private final int[] dy = new int[]{0, -1, 0, 1};
public int bfs(int[][] grid, int n, int x, int y, int endX, int endY) {
boolean[][] vis = new boolean[n][n];
Queue<int[]> queue = new LinkedList<>();
queue.offer(new int[]{x, y, 0});
vis[x][y] = true;
while (!queue.isEmpty()) {
int[] now = queue.poll();
for (int i = 0; i < 4; i++) {
int nx = now[0] + dx[i];
int ny = now[1] + dy[i];
if (nx &