Java 实现二进制矩阵最短畅通路径算法
Java 实现二进制矩阵最短畅通路径算法
本文介绍了使用 Java 实现二进制矩阵最短畅通路径算法的思路和代码,该算法利用广度优先搜索 (BFS) 寻找从左上角到右下角的路径,并返回最短路径长度。
问题描述:
给你一个 n x n 的二进制矩阵 grid 中,返回矩阵中最短畅通路径的长度。如果不存在这样的路径,返回 -1 。
二进制矩阵中的畅通路径是一条从左上角单元格(即,(0, 0))到右下角单元格(即,(n - 1, n - 1))的路径,该路径同时满足下述要求:
- 路径途经的所有单元格的值都是 0 。
- 路径中所有相邻的单元格应当在 8 个方向之一上连通(即,相邻两单元之间彼此不同且共享一条边或者一个角)。
- 畅通路径的长度是该路径途经的单元格总数。
解题思路:
本题可以使用广度优先搜索(BFS)来解决,具体思路如下:
- 首先判断左上角和右下角是否为 0,如果不是则无法到达终点,返回 -1;
- 定义一个队列,将起点加入队列;
- 定义一个 visited 数组,记录每个位置是否被访问过;
- 定义一个 step 变量,记录当前所在位置的步数;
- 进入循环,每次从队列中取出一个位置,判断是否为终点,如果是则返回当前步数;
- 否则,将当前位置的所有相邻位置加入队列,如果相邻位置没有被访问过且为 0,则将其标记为已访问,并将其加入队列,步数加一;
- 如果队列为空,则说明无法到达终点,返回 -1。
Java 代码实现:
class Solution {
public int shortestPathBinaryMatrix(int[][] grid) {
int n = grid.length;
if (grid[0][0] == 1 || grid[n - 1][n - 1] == 1) {
return -1;
}
Queue<int[]> queue = new LinkedList<>();
queue.offer(new int[]{0, 0});
boolean[][] visited = new boolean[n][n];
visited[0][0] = true;
int step = 1;
int[][] directions = {{-1, -1}, {-1, 0}, {-1, 1}, {0, -1}, {0, 1}, {1, -1}, {1, 0}, {1, 1}};
while (!queue.isEmpty()) {
int size = queue.size();
for (int i = 0; i < size; i++) {
int[] current = queue.poll();
if (current[0] == n - 1 && current[1] == n - 1) {
return step;
}
for (int[] direction : directions) {
int row = current[0] + direction[0];
int col = current[1] + direction[1];
if (row >= 0 && row < n && col >= 0 && col < n && grid[row][col] == 0 && !visited[row][col]) {
queue.offer(new int[]{row, col});
visited[row][col] = true;
}
}
}
step++;
}
return -1;
}
}
代码说明:
shortestPathBinaryMatrix(int[][] grid)函数接受一个二进制矩阵 grid 作为参数,并返回最短畅通路径的长度。- 代码首先判断左上角和右下角是否为 0,如果不是则无法到达终点,返回 -1。
- 然后初始化队列、visited 数组和 step 变量。
- 循环遍历队列,每次取出一个位置,判断是否为终点,如果是则返回当前步数。
- 否则,将当前位置的所有相邻位置加入队列,如果相邻位置没有被访问过且为 0,则将其标记为已访问,并将其加入队列,步数加一。
- 如果队列为空,则说明无法到达终点,返回 -1。
总结:
本文介绍了使用 Java 实现二进制矩阵最短畅通路径算法的思路和代码,希望对大家有所帮助。
原文地址: https://www.cveoy.top/t/topic/fWPU 著作权归作者所有。请勿转载和采集!