leetcode 1021 dfs 迷宫 最短

dfs求最短需要遍历所有路径,设置全局变量比较
leetcode global 关键字失效,使用self.
方法超时

global
nonlocal
https://blog.csdn.net/qq_42780289/article/details/89244761

讲条件从 for循环里拆出来

class Solution:
    def shortestPathBinaryMatrix(self, grid) -> int:
        self.minvalue= float('inf')

        def dfs(x, y, sum_val):
            direct = [(0, 1), (1, 0), (0, -1), (-1, 0), (1, -1), (-1, 1), (1, 1), (-1, -1)]
            #global minvalue
            if x<0 or y<0 or x>=len(grid) or y>=len(grid[0]):
                return 
            if grid[x][y]!=0:
                return 

            if x == len(grid) - 1 and y == len(grid[0]) - 1:
                self.minvalue = min(sum_val, self.minvalue)
                return

            grid[x][y] = 1
            for item in direct:

                    sum_val += 1

                    dfs(x + item[0], y + item[1], sum_val)

                    sum_val -= 1

            grid[x][y] = 0

        dfs(0, 0, 1)
        if self.minvalue == float('inf') :
            return -1
        else:
            return self.minvalue

最短路径 bfs
使用deque() .append() .popleft()
否则队列不会pop出元素。

 class Solution:
    def shortestPathBinaryMatrix(self, grid) -> int:

        direct = [(0, 1), (1, 0), (0, -1), (-1, 0), (1, -1), (-1, 1), (1, 1), (-1, -1)]

        queue=deque()
        queue.append([0,0])
        level=1
        if grid[0][0]==1 or grid[-1][-1]==1:
            return -1
        if len(grid)==1:
            return 1

        while queue:

            for _ in range(len(queue)):
                x,y=queue.popleft()



                for item in direct:
                    if x+item[0]==len(grid)-1 and y+item[1]==len(grid[0])-1:
                        return level+1
                    if 0<=x+item[0]<len(grid) and 0<=y+item[1]<len(grid[0]) and grid[x+item[0]][y+item[1]]==0:
                        queue.append([x+item[0],y+item[1]])
                        grid[x+item[0]][y+item[1]]=1


            level+=1
        return -1
全部评论

相关推荐

点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务