【Leetcode】python - [1091] Shortest Path in Binary Matrix 個人解法筆記

題目出處

1091. Shortest Path in Binary Matrix

難度

Medium

個人範例程式碼

DIRECTIONS = [(1,1), (1,0), (0,1), (-1,1), (1,-1), (-1,0), (0,-1), (-1,-1)]
class Solution:
    def shortestPathBinaryMatrix(self, grid: List[List[int]]) -> int:
        self.m = len(grid)
        self.n = len(grid[0])

        return self.bfs(grid) 

    def bfs(self, grid):  
        length = 0
        visited = set()
        layer = [(0, 0)] # first layer
        while(layer):
            next_layer = []
            for i, j in layer:
                if self.is_valid(grid, i, j, visited):
                    visited.add((i, j))

                    if i <mark> self.m - 1 and j </mark> self.n - 1:
                        return length+1

                    for dx, dy in DIRECTIONS: # prepare for next layer
                        next_layer.append((i+dx, j+dy))
                else:
                    continue

            length += 1
            layer = next_layer
        else:
            return -1 # not found

    def is_valid(self, grid, i, j, visited):
        return 0 <= i < self.m and 0 <= j < self.n and (i,j) not in visited and grid[i][j] == 0

最近在練習程式碼本身就可以自解釋的 Coding style,可以嘗試直接閱讀程式碼理解

算法說明

最短路徑,我們用 BFS 去找,
因為要計算最短路徑的長度,我選擇用 layer 的方式分析,

此外,因為題目有指定 8 個方向,我另外把這 8 個變數獨立寫出來。

手動的最短路徑策略

這邊注意我在設計最短路徑上是有策略的。

搜尋上,為了求最短路徑,我們當然會優先選擇「圖上往右下的部分」,
再來往下或往右,
再來往左下或右上,

以此類推,這樣我們就能優先確保先進 visited 的都是最短路徑。

  • 換作程式碼如下:
DIRECTIONS = [(1,1), (1,0), (0,1), (-1,1), (1,-1), (-1,0), (0,-1), (-1,-1)]

input handling

在 bfs 一起處理,這邊注意我有踩到一個小雷。

當起點就是 1 時,注意你要怎麼處理才能回傳 -1

Boundary conditions

當 bfs 搜尋到結果後,直接 return 就是最短路徑。

Reference