問(wèn)題1091:BFS 二進(jìn)制矩陣中的最短路徑

問(wèn)題1091:0表示可通行,1表示不可通行,每走一步可以向上、下、左、右、左上、左下、右上、右下,共八個(gè)方向。求解從左上角到右下角的最短路徑長(zhǎng)度,如果無(wú)法到達(dá),返回-1。

這題明顯可以用BFS進(jìn)行搜索,具體過(guò)程如下面動(dòng)圖所示。因?yàn)槊看嗡阉饕疾?code>8個(gè)方向,可能越出矩陣范圍,因此預(yù)處理時(shí)把矩陣周?chē)鷩弦蝗?code>1。

完整代碼:

class Solution:
    def shortestPathBinaryMatrix(self, grid: List[List[int]]) -> int:     
        m = len(grid)
        if grid[0][0] == 0 and grid[m-1][m-1] == 0:
            for i in range(m):
                grid[i].insert(0, 1)
                grid[i].append(1)
            grid.insert(0, [1]*(m+2))
            grid.append([1]*(m+2))
            queue = []
            queue.append([1,1])
            seen = set()
            seen.add((1,1))
        else:
            return -1
        while queue:
            vertex = queue.pop(0)
            nodes = [(-1,-1), (-1,0), (-1,1), (0,-1), (0,1), (1,-1), (1,0), (1,1)]
            for node in nodes:
                new = (vertex[0]+node[0], vertex[1]+node[1])
                if grid[new[0]][new[1]] == 0 and new not in seen:                
                    queue.append(new)
                    seen.add(new)
                    grid[new[0]][new[1]] = grid[vertex[0]][vertex[1]] + 1
        return grid[m][m]+1 if (m, m) in seen else -1

運(yùn)行結(jié)果:

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容