Shortest Path in Binary Matrix
In an N by N square grid, each cell is either empty (0) or blocked (1).
A clear path from top-left to bottom-right has length k
if and only if it is composed of cells C_1, C_2, ..., C_k
such that:
Adjacent cells
C_i
andC_{i+1}
are connected 8-directionally (ie., they are different and share an edge or corner)C_1
is at location(0, 0)
(ie. has valuegrid[0][0]
)C_k
is at location(N-1, N-1)
(ie. has valuegrid[N-1][N-1]
)If
C_i
is located at(r, c)
, thengrid[r][c]
is empty (ie.grid[r][c] == 0
).
Return the length of the shortest such clear path from top-left to bottom-right. If such a path does not exist, return -1.
Example 1:
Input: [[0,1],[1,0]]
Output: 2
Example 2:
Input: [[0,0,0],[1,1,0],[1,1,0]]
Output: 4
Note:
1 <= grid.length == grid[0].length <= 100
grid[r][c]
is0
or1
class Solution {
public int shortestPathBinaryMatrix(int[][] grid) {
if (grid[0][0] == 1 || grid[grid.length - 1][grid[0].length - 1] == 1)
return -1;
int[][] dir = { { 1, 0 }, { 0, 1 }, { -1, 0 }, { 0, -1 }, { 1, 1 }, { 1, -1 }, { -1, 1 }, { -1, -1 } };
boolean[][] visited = new boolean[grid.length][grid[0].length];
Queue<int[]> q = new LinkedList<>();
q.add(new int[] { 0, 0 });
int steps = 1;
while (q.size() != 0) {
int size = q.size();
while (size-- > 0) {
int[] pos = q.poll();
if (pos[0] == grid.length - 1 && pos[1] == grid[0].length - 1)
return steps;
if (visited[pos[0]][pos[1]])
continue;
visited[pos[0]][pos[1]] = true;
for (int i = 0; i < 8; i++) {
int newX = pos[0] + dir[i][0], newY = pos[1] + dir[i][1];
if (newX >= 0 && newX < grid.length && newY >= 0 && newY < grid[0].length && grid[newX][newY] == 0)
q.add(new int[] { newX, newY });
}
}
steps++;
}
return -1;
}
}
Last updated