---
description: BFS
---

# 1091. Shortest Path in Binary Matrix

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`.

A **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:

* All the visited cells of the path are `0`.
* All the adjacent cells of the path are **8-directionally** connected (i.e., they are different and they share an edge or a corner).

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

&#x20;

**Example 1:**

![](https://assets.leetcode.com/uploads/2021/02/18/example1_1.png)

<pre><code><strong>Input: grid = [[0,1],[1,0]]
</strong><strong>Output: 2
</strong></code></pre>

**Example 2:**

![](https://assets.leetcode.com/uploads/2021/02/18/example2_1.png)

<pre><code><strong>Input: grid = [[0,0,0],[1,1,0],[1,1,0]]
</strong><strong>Output: 4
</strong></code></pre>

**Example 3:**

<pre><code><strong>Input: grid = [[1,0,0],[1,1,0],[1,1,0]]
</strong><strong>Output: -1
</strong></code></pre>

&#x20;

**Constraints:**

* `n == grid.length`
* `n == grid[i].length`
* `1 <= n <= 100`
* `grid[i][j] is 0 or 1`

分析

要求找左上到右下最短距离，八个方向，只能使用0

错误：

step不要改，直接传入q时step+1，否则会影响该子层别的节点

需要visited !!!!!

```
class Solution:
    def shortestPathBinaryMatrix(self, grid: List[List[int]]) -> int:
        q = deque()
        n, m = len(grid), len(grid[0])
        if grid[0][0] == 1:
            return -1
        q.append((0, 0, 1))
        grid[0][0] = 1
        dir = [(-1, 0), (1, 0), (0, -1), (0, 1),(-1,-1),(-1,1),(1,-1),(1,1)]
        while q:
            x,y,step = q.popleft()
            if x == n - 1 and y == m - 1:
                return step
            for dx, dy in dir:
                nx, ny = x + dx, y + dy
                if 0<=nx<n and 0<=ny<m and grid[nx][ny] == 0:
                    q.append((nx, ny,step+1))
                    grid[nx][ny] = 1
                
        return -1
        
```
