leetcode-167周赛-1293-网格中的最短路径

题目描述:

 

 

 自己的提交:广度优先 O(mn*min(k,m+n))

 

 

class Solution:
    def shortestPath(self, grid, k: int) -> int:
        visited = {}
        queue = [[0,0,k-1]]if grid[0][0] == 1 and k > 0 else [[0,0,k]]
        if k == 0 and grid[0][0] == 1:
            return 0
        m,n = len(grid),len(grid[0])
        k = min(m+n-3,k) #
        res = 0
        while queue:
            tmp = []
            for i,j,k in queue:
                if i == m-1 and j == n-1:
                    return res
                for i_,j_ in [(i+1,j),(i-1,j),(i,j+1),(i,j-1)]:
                    if 0 <= i_ < m and 0 <= j_ < n :
                        if grid[i_][j_] == 0 and ((i_,j_) not in visited or k > visited[(i_,j_)]):
                            tmp.append([i_,j_,k])
                            visited[(i_,j_)] = k
                        elif k > 0 and ((i_,j_) not in visited or k-1 > visited[(i_,j_)]):
                            tmp.append([i_,j_,k-1])
                            visited[(i_,j_)] = k - 1
            queue = tmp[::]
            res += 1
        return -1
posted @ 2019-12-24 11:32  oldby  阅读(473)  评论(0编辑  收藏  举报