1091. Shortest Path in Binary Matrix

Question

Given an n x n binary matrix grid, return the length of the shortest clear path in the matrix. If there is no clear path, return -1.

clear path in a binary matrix is a path from the top-left cell (i.e., (0, 0)) to the bottom-right cell (i.e., (n - 1, n - 1)) such that:

The length of a clear path is the number of visited cells of this path.

Example 1:

Input: grid = [[0,1],[1,0|0,1],[1,0]]
Output: 2

Example 2:

Input: grid = [[0,0,0],[1,1,0],[1,1,0|0,0,0],[1,1,0],[1,1,0]]
Output: 4

Example 3:

Input: grid = [[1,0,0],[1,1,0],[1,1,0|1,0,0],[1,1,0],[1,1,0]]
Output: -1

Constraints:

Approach 1: BFS

Intuition

Algorithm

Code

class Solution {
public:
    vector<pair<int, int>> directions = {
        {-1, -1},
        {-1, 0},
        {-1, 1},
        {0, -1},
        {0, 1},
        {1, -1},
        {1, 0},
        {1, 1}
    };

    int shortestPathBinaryMatrix(vector<vector<int>>& grid) {
        int rows = grid.size(), cols = grid[0].size();
        vector<vector<int>> visited(rows, vector<int>(cols, 0));
        // {{row, col}, dist}
        queue<pair<pair<int, int>,int>> q;     
        if (grid[0][0] == 0) {
            q.push({{0, 0}, 1});
            visited[0][0] = 1;
        }

        while(!q.empty()) {
            int r = q.front().first.first;
            int c = q.front().first.second;
            int currDistance = q.front().second;
            q.pop();

            if (r == rows - 1 && c == cols - 1) {
                return currDistance;
            }

            for (auto direction: directions) {
                int nr = r + direction.first;
                int nc = c + direction.second;

                if (nr < 0 || nr >= rows || nc < 0 || nc >= cols || grid[nr][nc] != 0 || visited[nr][nc]) continue;


                q.push({{nr, nc}, currDistance + 1});
                visited[nr][nc] = 1;
            }
        }

        return -1;
    }
};

Complexity Analysis