首页 > 其他分享 >LeetCode -- 980. 不同路径 III

LeetCode -- 980. 不同路径 III

时间:2023-08-04 09:46:45浏览次数:44  
标签:vis -- 980 dfs int grid size III left

 本题让我们求不相交路径数目

 

方法1:递归/回溯

dfs(x, y, left) 表示从点x, y出发,还剩下left个可行走点的路径数目。

每行走到一个新的点就将该点设置为-1, 避免重复搜索。

当走到终点时,如果left == 0 则答案 + 1

class Solution {

    int dfs(vector<vector<int>> &grid, int x, int y, int left) {
        if(x < 0 || x >= grid.size() || y < 0 || y >= grid[0].size() || grid[x][y] < 0) {
            return 0;
        }

        if(grid[x][y] == 2) return left == 0;

        grid[x][y] = -1;

        int ans = dfs(grid, x - 1, y, left - 1) + dfs(grid, x, y - 1, left - 1) +
                  dfs(grid, x + 1, y, left - 1) + dfs(grid, x, y + 1, left - 1);

        grid[x][y] = 0; 

        return ans;
    }

public:
    int uniquePathsIII(vector<vector<int>>& grid) {
        int m = grid.size(), n = grid[0].size(), sx, sy, cnt = 0;
        for(int i = 0; i < m; i ++ ) {
            for(int j = 0; j < n; j ++ ) {
                if(grid[i][j] == 0) cnt ++ ;
                else if(grid[i][j] == 1) sx = i, sy = j; 
            }
        }

        return dfs(grid, sx, sy, cnt + 1);

    }
};

 

方法二:位运算和状态压缩

class Solution {
public:
    int uniquePathsIII(vector<vector<int>>& grid) {
        int m = grid.size(), n = grid[0].size(), vis = 0, sx, sy;

        for(int i = 0; i < m; i ++ ) {
            for(int j = 0; j < n; j ++ ) {
                if(grid[i][j] < 0) vis |= 1 << (i * n + j);
                else if(grid[i][j] == 1) sx = i, sy = j;
            }
        }

        int all = (1 << m * n) - 1;
        unordered_map<int, int> memo;

        function<int(int, int, int)> dfs = [&](int x, int y, int vis) -> int {
            int p = x * n + y;
            if(x < 0 || x >= m || y < 0 || y >= n || vis >> p & 1) return 0;
            vis |= 1 << p;
            if(grid[x][y] == 2) return vis == all;
            int key = (p << m * n) | vis; //这里进行哈希,把p和vis拼起来
            if(memo.count(key)) return memo[key];
            return memo[key] = dfs(x - 1, y, vis) + dfs(x, y - 1, vis) +
                               dfs(x + 1, y, vis) + dfs(x, y + 1, vis);
        };

        return dfs(sx, sy, vis);
    }
};

 

      

标签:vis,--,980,dfs,int,grid,size,III,left
From: https://www.cnblogs.com/zk6696/p/17605045.html

相关文章

  • Hive Merge详解
    说明Hive在2.2版本之后开始支持Merge操作,并且Merge只能在支持ACID的表上执行语法MERGEINTO<targettable>ASTUSING<sourceexpression/table>ASSON<booleanexpression1>WHENMATCHED[AND<booleanexpression2>]THENUPDATESET<setclauselist>WHEN......
  • NET7下的WEB API示例
    NET7下的WEBAPI示例 [Route("api/[controller]")][ApiController]publicclassShopADController:ControllerBase{privatereadonlyIRepository<Model.ShopAD,int>_shopAD;publicShopADController(IRepository&l......
  • Redis从入门到放弃(8):哨兵模式
    在前面的文章中介绍了Redis的主从复制,但主从复制存在一定的缺陷。如果Master节点宕机,因为不具备自动恢复功能,需要人工干预,那么在这个干预过程中Redis将不可用。为了解决这一问题,Redis官方推荐一种高可用方案:哨兵模式(Sentinel)。1、什么是哨兵模式?哨兵模式是Redis的高可用解决方......
  • TwinCAT3中松下伺服A6BF的全闭环设置步骤
    以TwinCAT3和A6BF进行全闭环测试,带有编码器和绝对式光栅尺,实测有效;扫描硬件首先安装EtherCAT网口驱动:点击安装网卡驱动(TWINCAT-ShowRealtimeEthercatCompatibelDevices,然后选中某个设备,点击Install;将官网下载的Panasonic_MINAS-A6BF_V1_3.xml文件导入D:\TwinCAT\3.1\Confi......
  • Cilium系列-12-启用 Pod 的 BBR 拥塞控制
    系列文章Cilium系列文章前言将Kubernetes的CNI从其他组件切换为Cilium,已经可以有效地提升网络的性能.但是通过对Cilium不同模式的切换/功能的启用,可以进一步提升Cilium的网络性能.具体调优项包括不限于:启用本地路由(NativeRouting)完全替换KubeProxyI......
  • docker login&&docker search 时报错
    在dockersearch时报错(centos7-9)问题:Errorresponsefromdaemon:Get"https://index.docker.io/v1/search?q=centos&n=25":dialtcp:lookupindex.docker.ioon192.168.6.2:53:readudp192.168.6.137:47270->192.168.6.2:53:i/otimeout  dns问题无......
  • gRPC的测试
    gRPC(Googleremoteprocedurecall)远程过程调用,使不同服务在不同机器上互相调用就像调本地一样方便但调用方和服务方对应开发不是一个人,出现问题,没法确认是哪方的问题,因此,可以使用BloomRPC工具测试rpc服务是否正常 1、测试工具:BloomRPC,下载地址 https://github.com/uw-labs/......
  • ubuntu 默认python版本切换
    Ubuntu下完美切换Python版,即设置系统默认的python版本(亲测有效)_ubuntu切换python版本_关彼得的博客-CSDN博客 sudosuupdate-alternatives--listpythonupdate-alternatives:error:noalternativesforpythonupdate-alternatives--install/usr/bin/pythonpytho......
  • new 和 getInstance
    getInstance指实例化。getInstance在单例模式(保证一个类仅有一个实例,并提供一个访问它的全局访问点)的类中常见,用来生成唯一的实例,getInstance往往是static的。一般用于比较大、复杂的对象,只初始化一次,而getInstance保证了每次调用都返回相同的对象。(1)对象使用之前通过getIn......
  • 盘点一个初学者Python库安装的问题(Mac系统)(下篇
    大家好,我是皮皮。一、前言前几天在Python私教群【Emma】问了一个Python库安装的基础问题,一起来看看吧。上一篇文章讲到【Emma】的远程环境不给力,需要继续本地指导。二、实现过程针对导包失败的问题,这里【狂吃山楂片】给了一个解决方法,如下图所示:右下角可以设置环境,你点一下,......