• 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

      

  • 相关阅读:
    安全体系(一)—— DES算法详解
    Windows下将gvim8配置为Python IDE
    SSH原理记录
    Spring Cloud 注册中心Eureka
    Spring Cloud 声明式服务调用 Feign
    Spring Cloud 客服端负载均衡 Ribbon
    Http服务器实现文件上传与下载(四)
    1.项目优化
    分支的创建与代码的推送——提交用户列表功能代码
    主页Header布局
  • 原文地址:https://www.cnblogs.com/gaodi2345/p/15095124.html
Copyright © 2020-2023  润新知