Problem of The Day: Shortest Path in Binary Matrix
Problem Statement

Intuition
The problem asks to find the shortest path from the top-left corner to the bottom-right corner in a binary matrix. Each cell in the matrix is either passable (0) or blocked (1). The intuition is to perform a breadth-first search (BFS) since it explores all possible paths level by level, ensuring the first time we reach the destination, it is the shortest path.
Approach
- We start by checking if the first or last cell is blocked. If either is blocked, there is no path, so we return -1.
- Then we initialize a queue to perform BFS. The queue will store the coordinates of cells we visit, starting from the top-left corner.
- For each cell, we check all 8 possible directions (up, down, left, right, and diagonals). If a neighboring cell is within bounds and passable, we mark it as visited by updating its value to the current distance from the start and add it to the queue.
- The algorithm terminates when we reach the bottom-right corner, returning the distance traveled. If we exhaust all options and never reach the destination, we return -1.
Complexity
- 
    Time complexity: The time complexity is \(O(n^2)\), where n is the number of rows (or columns, assuming the matrix is square). We visit each cell at most once, and checking neighbors is constant work. 
- 
    Space complexity: The space complexity is also \(O(n^2)\) due to the queue, which could potentially hold all cells in the matrix in the worst case. 
Code
class Solution:
    def shortestPathBinaryMatrix(self, grid: List[List[int]]) -> int:
        if grid[0][0] != 0 or grid[-1][-1] != 0:
            return -1
        ROWS = len(grid)
        COLS = len(grid[0])
        queue = deque()
        queue.append([0, 0])
        grid[0][0] = 1
        while queue:
            r, c = queue.popleft()
            dist = grid[r][c]
            if r == ROWS - 1 and c == COLS -1:
                return dist
            for x, y in [(0,1),(1,1),(1,0),(1,-1),(0,-1),(-1,-1),(-1,0),(-1,1)]:
                row, col = r + x, c + y
                if 0 <= row < ROWS and 0 <= col < COLS and grid[row][col] == 0:
                    grid[row][col] = dist + 1
                    queue.append([row, col])
        return -1