Java实现二进制矩阵中的最短畅通路径

给定一个 n x n 的二进制矩阵 grid,你需要找到从左上角单元格 (0, 0) 到右下角单元格 (n - 1, n - 1) 的最短畅通路径的长度。

二进制矩阵中的 畅通路径 是一条满足以下条件的路径:

  • 路径途经的所有单元格的值都是 0 。
  • 路径中所有相邻的单元格应当在 8 个方向之一 上连通(即,相邻两单元之间彼此不同且共享一条边或者一个角)。
  • 畅通路径的长度 是该路径途经的单元格总数。

如果不存在这样的路径,返回 -1 。

思路:

本题可以使用广度优先搜索(BFS)来解决。BFS 算法能够有效地找到从起点到终点的最短路径。

算法步骤:

  1. 将起点 (0, 0) 加入队列中,并将其标记为已访问。
  2. 当队列不为空时,执行以下操作:
    • 从队列中取出一个节点。
    • 如果该节点是终点 (n - 1, n - 1),则返回当前步数。
    • 否则,遍历该节点的 8 个相邻节点:
      • 如果相邻节点未越界、值为 0 且未被访问过,则将其加入队列,并标记为已访问。
  3. 如果队列为空,说明没有找到从起点到终点的路径,返回 -1。

Java代码:

import java.util.LinkedList;
import java.util.Queue;

class Solution {
    public int shortestPathBinaryMatrix(int[][] grid) {
        if (grid == null || grid.length == 0 || grid[0].length == 0 || grid[0][0] == 1) {
            return -1;
        }
        int n = grid.length;
        int[][] directions = {{0, 1}, {0, -1}, {1, 0}, {-1, 0}, {1, 1}, {1, -1}, {-1, 1}, {-1, -1}};
        Queue<int[]> queue = new LinkedList<>();
        queue.offer(new int[]{0, 0}); // 将起点加入队列
        boolean[][] visited = new boolean[n][n];
        visited[0][0] = true; // 标记起点已访问
        int pathLength = 1; // 初始化路径长度
        while (!queue.isEmpty()) {
            int size = queue.size();
            for (int i = 0; i < size; i++) {
                int[] curr = queue.poll();
                if (curr[0] == n - 1 && curr[1] == n - 1) { // 到达终点
                    return pathLength;
                }
                for (int[] dir : directions) { // 遍历 8 个方向
                    int newRow = curr[0] + dir[0];
                    int newCol = curr[1] + dir[1];
                    if (newRow >= 0 && newRow < n && newCol >= 0 && newCol < n && grid[newRow][newCol] == 0 && !visited[newRow][newCol]) {
                        queue.offer(new int[]{newRow, newCol});
                        visited[newRow][newCol] = true;
                    }
                }
            }
            pathLength++;
        }
        return -1; // 无法到达终点
    }
}
Java实现二进制矩阵中的最短畅通路径

原文地址: https://www.cveoy.top/t/topic/fWPN 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录