LeetCode | 980. 不同路径 III

在二维网格 grid 上,有 4 种类型的方格:

1 表示起始方格。且只有一个起始方格。
2 表示结束方格,且只有一个结束方格。
0 表示我们可以走过的空方格。
-1 表示我们无法跨越的障碍。
返回在四个方向(上、下、左、右)上行走时,从起始方格到结束方格的不同路径的数目。

每一个无障碍方格都要通过一次,但是一条路径中不能重复通过同一个方格。

示例 1:

输入:[[1,0,0,0],

    [0,0,0,0],

      [0,0,2,-1]]
输出:2
解释:我们有以下两条路径:
1. (0,0),(0,1),(0,2),(0,3),(1,3),(1,2),(1,1),(1,0),(2,0),(2,1),(2,2)
2. (0,0),(1,0),(2,0),(2,1),(1,1),(0,1),(0,2),(0,3),(1,3),(1,2),(2,2)

class Solution:
    def uniquePathsIII(self, grid: List[List[int]]) -> int:
        def backtrack(i, j, leave):
            if grid[i][j] == 2 and leave == 0:  # 找到符合条件的路径
                self.res += 1
                return
            visited[i][j] = True
            leave -= 1
            for x, y in [[i+1, j], [i-1, j], [i, j+1], [i, j-1]]:
                if 0 <= x < row and 0 <= y < col and not visited[x][y] and grid[x][y] >= 0:
                    backtrack(x, y, leave)  # drill down到下一层
            visited[i][j] = False

        self.res = 0  # 统计路径的数目
        row = len(grid)
        col = len(grid[0])
        leave = row * col  # 还剩下的点
        visited = [[False] * col for _ in range(row)]  # 标记某个点是否被访问过
        for i in range(row):
            for j in range(col):
                if grid[i][j] == 1:  # 保存起始点
                    start = [i, j]
                elif grid[i][j] == -1 or grid[i][j] == 2:  # 此时,只留下值是0和1的点的个数
                    leave -= 1
        backtrack(start[0], start[1], leave)
        return self.res

  

原文地址:https://www.cnblogs.com/gaodi2345/p/15095124.html