LC.1091. Shortest Path in Binary Matrix

在这里插入图片描述

class Solution(object):
    def shortestPathBinaryMatrix(self, grid):
        """
        之所以每次压栈以后能将grid[i][j]变成1,因为如果该位置已经有当前路径已经到达了,其他路径不需要再到达这个地方了,不然就是绕路没有意义
        带回溯的DFS之所以超时是因为DFS是一条条路径遍历的,每次都有多条路径选择,BFS多条路径并行搜索,将访问过的点进行标记减少了搜索空间
        """
        from collections import deque
        queue = deque()
        if grid[0][0] ==1 or grid[-1][-1] == 1:
            return -1
        queue.append((0,0,1))
        while(len(queue)):
            i,j,path = queue.popleft()
            if i == len(grid)-1 and j == len(grid[0])-1:
                return path
            for xx, yy in  ((i-1,j-1),(i-1,j),(i-1,j+1),(i,j-1),(i,j+1),(i+1,j-1),(i+1,j),(i+1,j+1)):
                if 0 <= xx < len(grid) and 0 <= yy < len(grid[0]) and grid[xx][yy] == 0:
                    grid[xx][yy] =1
                    queue.append((xx,yy,path+1))
        return -1

下面的方法会超时

class Solution(object):
    def shortestPathBinaryMatrix(self, grid):
        """
        :type grid: List[List[int]]
        :rtype: int
        """
        self.res = float("inf")
        visited = [[0]*len(grid[0]) for i in range(len(grid))]

        if grid[0][0] == 0:
            self.DFS(0,0,0, grid,visited)
        return self.res if self.res != float("inf") else -1


    def DFS(self, x, y, path, grid, visited):
        if x == len(grid) -1 and y == len(grid[0]) -1:
            self.res = min(self.res, path+1)
        else:
            for xx, yy in self.neigh(x, y, grid):
                if visited[xx][yy] == 0:
                    visited[xx][yy] =1
                    self.DFS(xx, yy, path+1, grid, visited)
                    visited[xx][yy] =0

    def neigh(self, x, y, grid):
        for xx,yy in [(x-1,y-1), (x-1, y), (x-1,y+1),
                      (x,y-1), (x,y+1),
                      (x+1, y-1), (x+1, y), (x+1,y+1)]:
            if 0 <= xx < len(grid) and 0 <= yy < len(grid[0]) and grid[xx][yy]==0:
                yield  xx, yy
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值