题目描述:
自己的提交:广度优先 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