【问题标题】:An interview question: find the direction of first step一道面试题:找到第一步的方向
【发布时间】:2020-04-11 05:06:31
【问题描述】:

问题描述如下:

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

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

上车时记2点。下车时记3点。左车时记4点。右车时记5点.

方向的优先级是上、下、左、右从大到小,即如果你能到达上或下一点距离最短的目标点,你就应该开始了。

标记后返回矩阵。 0

我尝试在 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)

【问题讨论】:

    标签: python graph typeerror breadth-first-search


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-03
      • 1970-01-01
      相关资源
      最近更新 更多