在一个 N × N 的方形网格中,每个单元格有两种状态:空(0)或者阻塞(1)。 一条从左上角到右下角、长度为 k 返回这条从左上角到右下角的最短畅通路径的长度。如果不存在这样的路径,返回 -1 。
利用BFS的思想,并且注意开始的字符不为0的情况
import javafx.util.Pair;
class Solution {
public static int shortestPathBinaryMatrix(int[][] grid) {
int row = grid.length;
int col = grid[0].length;
if (grid[0][0] != 0) {
return -1;
}
int[][] directions = {{0, -1}, {0, 1}, {-1, 0}, {1, 0}, {-1, -1}, {-1, 1}, {1, -1}, {1, 1}};
Queue<Pair<Integer, Integer>> queue = new LinkedList();
queue.add(new Pair(0, 0));
int pathLength = 0;
while (!queue.isEmpty()) {
int size = queue.size();
pathLength++;
while (size-- > 0) {
Pair<Integer, Integer> node = queue.poll();
int cr = node.getKey();
int cc = node.getValue();
if (cr == row - 1 && cc == col - 1) {
return pathLength;
}
for (int[] d : directions) {
int nr = cr + d[0];
int nc = cc + d[1];
if (nr < 0 || nr >= row || nc < 0 || nc >= col || grid[nr][nc] == 1) {
continue;
}
queue.add(new Pair(nr, nc));
grid[nr][nc] = 1; // 标记
}
}
}
return -1;
}
}