python - 面试题: find the direction of first step

标签 python graph typeerror breadth-first-search

问题描述如下:

给定 M 行 N 列的矩阵,0 代表空白区域,- 1 代表障碍物,1 代表目标点(有多个目标点)。

对于每个空位,如果你想以最短距离到达目标点,请标记第一步的方向。

如果从上开始,则应将点标记为 2。如果从下开始,应将点标记为 3。如果从左开始,应将点标记为 4。如果从右开始,应将点标记为 5 .

方向的优先级从大到小为上、下、左、右,即如果你能以距离上或下的最短距离到达目标点,就应该出发。

返回标记后的矩阵。 0<米,n<1000

我尝试用 python 编写解决方案,但总是收到“TypeError: 'NoneType' object is not iterable”。实在不知道为什么。如果您能指出问题,我将非常感谢您的帮助!

我的基本想法是,对于每个空单元格,使用 BFS 找到其最近的目标。然后通过指定这个空单元格作为起点,并将最近的目标指定为目的地,我找出第一步的方向。代码可能不是那么简洁,感谢您的时间和精力!

class Solution:
    """
    @param grid: the input matrix
    @return: the new matrix
    """
    grid = None
    def shortestPath(self, grid):
        # BFS
        self.grid = grid.copy()
        m = len(grid)
        n = len(grid[0]) if m > 0 else 0
        res = [[None] * n for _ in range(m)]

        for i in range(m):
            for j in range(n):
                if grid[i][j] not in [-1, 1]:
                    tarx, tary, step = self.bfs(i, j)
                    res[i][j] = self.search(i, j, tarx, tary)
                else:
                    res[i][j] = grid[i][j]

        return res

    def search(self, i, j, tarx, tary):
        dic = {0: 2, 1: 3, 2: 4, 3: 5}
        dirs = [[-1, 0], [1, 0], [0, -1], [0, 1]]
        min_dist = float('inf')
        direction = -1

        for idx, d in enumerate(dirs):
            x, y = i + d[0], j + d[1]
            if x == tarx and y == tary:
                return dic[idx]

            if self.inside(x, y):
                arr = [tarx, tary]
                _, __, dist = self.bfs(x, y, arr)
                if min_dist > dist:
                    min_dist = dist
                    direction = dic[idx]

        return direction

    def bfs(self, i, j, target = None):
        m = len(self.grid)
        n = len(self.grid[0]) if m > 0 else 0
        visit = [[False] * n for _ in range(m)]
        visit[i][j] = True
        dirs = [[-1, 0], [1, 0], [0, -1], [0, 1]]
        qu = [(i, j, 0)]

        while len(qu) > 0:
            ti, tj, step = qu[0][0], qu[0][1], qu[0][2]
            qu.pop()

            for d in dirs:
                x, y = ti + d[0], tj + d[1]
                if self.inside(x, y) and not visit[x][y]:
                    if not target:
                        if self.grid[x][y] == 1:
                            return x, y, step + 1
                    else:
                        tarx, tary = target[0], target[1]
                        if x == tarx and y == tary:
                            return x, y, step + 1

                    visit[x][y] = True
                    qu.append((x, y, step + 1))

    def inside(self, x, y):
        if 0 <= x < len(self.grid) and 0 <= y < len(self.grid[0]) and self.grid[x][y] != -1:
            return True
        return False

if __name__ == '__main__':
    testcase = [[1,0,0],[0,0,0]]
    ans = Solution().shortestPath(testcase)
    print(ans)

最佳答案

bfs 不会从所有可能的执行路径返回三元组。如果您完成循环而没有找到解决方案,那么您将退出底部并返回 None。这会使您的解包任务失败。

请参阅debug供您将来使用;我们希望您能够进行初步的问题诊断,而不仅仅是向我们转储未跟踪的程序。

关于python - 面试题: find the direction of first step,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61152358/

相关文章:

java - 检测在线图中连续添加边的循环?

javascript - Highcharts - 如何绘制置信区间

javascript - req.send ('null' ) 不是 Node.js mySQl 的函数

python-3.x - Sympy TypeError - 无法将浮点对象解释为整数

python - FastAPI问题的依赖注入(inject)

python - 在 Mac 上运行 PyGTK : AttributeError: xid attribute not supported?

python - 使用 python 日志记录模块时,如何记录脚本启动时花费的时间而不是实际时间?

python - Python 中的相似性度量

javascript - CanvasJS 图表上的交互式垂直线注释

javascript - 获取类型错误 : cannot call getNumber method of undefined