Leetcode刷题详解——不同路径 III

1. 题目链接:980. 不同路径 III

2. 题目描述:

在二维网格 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)

示例 2:

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

示例 3:

输入:[[0,1],[2,0]]
输出:0
解释:
没有一条路能完全穿过每一个空的方格一次。
请注意,起始和结束方格可以位于网格中的任意位置。

提示:

  • 1 <= grid.length * grid[0].length <= 20

3. 解法(递归):

3.1 算法思路:

对于四个方向,我们可以定义一个二维数组next,大小为4,每一维存储四个方向的坐标偏移量。题目要求到达目标位置时所有无障碍方块都存在路径中,我们可以定义一个变量记录num当前状态中剩余的未走过的无障碍方格个数,则当我们走到目标地点时只需要判断num是否为0即可,在移动时判断是否越界。

3.2 递归流程:

  1. 递归结束条件:当前位置的元素为2,若此时可走的位置数量num的值为0,则cnt的值加一;
  2. 遍历四个方向,若移动后未越界,无障碍并且未被标记,则标记当前位置,并递归移动后的位置,在回溯时撤销标记操作
    请添加图片描述

3.3 C++算法代码:

class Solution {
    bool vis[21][21]; // 访问标记数组
    int dx[4] = {1, -1, 0, 0}; // 四个方向的横坐标偏移量
    int dy[4] = {0, 0, 1, -1}; // 四个方向的纵坐标偏移量
    int ret; // 结果计数器
    int m, n, step; // 网格的行数、列数和步数
public:
    // 计算从起点到终点的唯一路径数量
    int uniquePathsIII(vector<vector<int>>& grid) {
        m = grid.size(), n = grid[0].size(); // 获取网格的行数和列数
        int bx = 0, by = 0; // 起点坐标
        for (int i = 0; i < m; i++) {
            for (int j = 0; j < n; j++) {
                if (grid[i][j] == 0) step++; // 统计可走的步数
                else if (grid[i][j] == 1) {
                    bx = i; // 记录起点坐标
                    by = j;
                }
            }
        }
        step += 2; // 加上起点和终点的步数
        vis[bx][by] = true; // 标记起点为已访问
        dfs(grid, bx, by, 1); // 从起点开始深度优先搜索
        return ret; // 返回结果计数器的值
    }
    void dfs(vector<vector<int>>& grid, int i, int j, int count) {
        if (grid[i][j] == 2) { // 如果当前位置是终点
            if (count == step) // 如果已经走过的步数等于总步数
                ret++; // 结果计数器加一
            return; // 结束当前递归
        }
        for (int k = 0; k < 4; k++) { // 遍历四个方向
            int x = i + dx[k], y = j + dy[k]; // 计算下一个位置的坐标
            if (x >= 0 && x < m && y >= 0 && y < n && !vis[x][y] && grid[x][y] != -1) { // 如果下一个位置在网格内且未被访问过且不是障碍物
                vis[x][y] = true; // 标记下一个位置为已访问
                dfs(grid, x, y, count + 1); // 继续深度优先搜索
                vis[x][y] = false; // 回溯,将下一个位置标记为未访问
            }
        }
    }
};

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/144278.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

主流接口测试框架对比,究竟哪个更好用

公司计划系统的开展接口自动化测试&#xff0c;需要我这边调研一下主流的接口测试框架给后端测试&#xff08;主要测试接口&#xff09;的同事介绍一下每个框架的特定和使用方式。后端同事根据他们接口的特点提出一下需求&#xff0c;看哪个框架更适合我们。 需求 1、接口编写…

Git 补丁使用

cmd进入到改目录 执行命令 比如tag1.11.4 到 tag 1.12.0 生成文件 the-patch.diff C:\code\Sandboxie>git diff v1.11.4 v1.12.0 -- > the-patch.diff 把这个the-patch.diff 拷贝到你的工程目录下 cmd到你的工程目录下 执行命令 git apply --reject the-patch.diff …

【溶解度工具】上海道宁为您带来了解溶解度、分散性、扩散、色谱等问题的强大而实用的软件集——HSPiP

高度参数化的UNIFAC技术 可以提供出色的预测 COSMO-RS方法的量子化学基础 可以在明确的公式中进行精确预测 Abraham参数和NRTL-SAC 也各有其独特的功能 优秀的配方师会使用 正确的工具来完成手头的工作 如果您必须只使用一种工具 那么它应该是 HSP 因为它可以很好地解…

MySQL锁机制详解

概述 锁是计算机协调多个进程或线程并发访问某一资源的机制。 在数据库中&#xff0c;除了传统的计算资源&#xff08;如CPU、RAM、I/O等&#xff09;的争用以外&#xff0c;数据也是一种供需要用户共享的资源。如何保证数据并发访问的一致性、有效性是所有数据库必须解决的一…

看看高情商的CHAT如何写演讲稿?

问CHAT&#xff1a;以“世界问候日&#xff0c;关心你我他”为主题&#xff0c;小学生国旗下讲话稿400字 CHAT 回复&#xff1a; 尊敬的校领导、亲爱的老师、可爱的同学们&#xff1a; 大家好&#xff01; 今天&#xff0c;在这蓝天白云、红旗飘扬的校园里&#xff0c;我代表…

vue3配置导航栏和页脚(附代码)

一&#xff1a;前言 本文主要是针对刚上手 Vue3 的初学者所写。涉及内容比较简单&#xff0c;没有太过于复杂的逻辑。因此有想学神入知识的可以看一下别的文章。 本次实验的技术是 Vue3 TypeScript Element Plus 。因为这三个是在 Vue 开发中经常一起出现的。如果没有学过的话…

RT-DETR算法优化改进:Backbone改进 | VanillaNet一种新视觉Backbone,极简且强大!华为诺亚2023

💡💡💡本文独家改进: VanillaNet助力RT-DETR ,替换backbone,简到极致、浅到极致!深度为6的网络即可取得76.36%@ImageNet的精度,深度为13的VanillaNet甚至取得了83.1%的惊人性能。 推荐指数:五星 RT-DETR魔术师专栏介绍: https://blog.csdn.net/m0_63774211/cat…

安卓:打包apk时出现Execution failed for task ‘:app:lintVitalRelease

Execution failed for task :lintVitalRelease 程序可以正常运行&#xff0c;但是打包apk的时候报Execution failed for task ‘:app:lintVitalRelease导致打包失败&#xff0c;原因是执行lintVitalRelease失败了&#xff0c;存在错误。解决办法&#xff1a;在app模块的build.…

【原创分享】DC-DC电源PCB设计要点

DC-DC电源是一种用于将直流&#xff08;DC&#xff09;电压转换为不同电压级别的电源。它通过内部的电路和拓扑结构&#xff0c;将输入电压调整为所需的输出电压&#xff0c;并提供稳定的电力供应。 DC-DC电源通常包括输入端子、输出端子、开关元件&#xff08;如开关管&#…

神通MPP数据库的跨库查询

神通MPP数据库的跨库查询 一. 简介二. 系统表三. 跨库查询语法1. 创建外部数据存储服务器2. 删除外部数据存储服务器3. 授予普通用户访问外部数据存储服务器权限4. 回收普通用户访问外部数据存储服务器权限5. 加密函数6. 访问外部数据存储服务器 ★ 四. 跨库查询&#xff1a;统…

记录:unity脚本的编写6.0

目录 unity UI系统添加ui编写脚本 unity UI系统 在日常的游戏或者别的什么活动中&#xff0c;ui总是必不可少的一项&#xff0c;在java中也有关于GUI的内容&#xff0c;unity也不例外&#xff0c;这次就使用脚本控制在unity添加的各种ui组件&#xff0c;使他们可以完成一些我们…

python读取excel,进行数据处理

一、准备python编译器 二、下载 pyexcel 库 pip install pyexcel-xls三、进行编码读取数据 import pyexcel# 读取Excel文件 成本中心字典 data pyexcel.get_array(file_name成本中心.xls)def hand():#打印数据#print(data)url f"INSERT INTO dst_base.sys_dict(p_…

终端神器:tmux

安装tmux简单使用自己的理解&#xff08;小白专属&#xff09; 使用的初衷&#xff1a; 在Linux终端下&#xff0c;由于session&#xff08;会话&#xff09;和windows&#xff08;窗口&#xff09;是绑定一起的&#xff0c;你打开一个终端的黑窗口就是打开一个会话&#xff0c…

MySQL中修改注释+报错1067错误时的解决方法

修改某字段的注释内容的mysql语句 ALTER TABLE consumption_table MODIFY COLUMN risk_level tinyint(1) NOT NULL DEFAULT 0 COMMENT 0-低 1-中 2-高;修改某字段的注释内容的mysql语句时报错1067的解决方法 首先执行MySQL语句&#xff1a;SET sql_mode ‘ALLOW_INVALID_DAT…

【C++】类和对象(3)--初始化列表(再谈构造函数)

目录 一 引入 二 初始化列表概念 三 初始化列表特性 1 引用和const 2 混合使用 3 自定义成员情况 四 初始化列表中的初始化顺序 五 总结 一 引入 构造函数体赋值 class Date { public:Date(int year, int month, int day){_year year;_month month;_day day;} priv…

Word软件手动安装Zotero插件

文章目录 Word软件手动安装Zotero插件方法一方法二 参考资料 Word软件手动安装Zotero插件 方法一 关闭word在zotero中依次点击编辑—首选项—引用—文字编辑软件—重新安装加载项Microsoft word 方法二 寻找Zotero.dotm存储位置&#xff0c; 例如D:\Program Files\Zotero\ext…

Qt DragDrop拖动与放置

本文章从属于 Qt实验室-CSDN博客系列 拖放操作包括两个动作&#xff1a;拖动(drag)和放下(drop或称为放置)。 拖动允许 对于要拖出的窗口或控件&#xff0c;要setDragEnabled(true) 对于要拖入的窗口或控件&#xff0c;要setAcceptDrops(true) 下面以一个具体的用例进行说…

Accelerate 0.24.0文档 二:DeepSpeed集成

文章目录 一、 DeepSpeed简介二、DeepSpeed集成&#xff08;Accelerate 0.24.0&#xff09;2.1 DeepSpeed安装2.2 Accelerate DeepSpeed Plugin2.2.1 ZeRO Stage-22.2.2 ZeRO Stage-3 with CPU Offload2.2.3 accelerate launch参数 2.3 DeepSpeed Config File2.3.1 ZeRO Stage-…

什么是 IT 资产管理(ITAM),以及它如何简化业务

IT 资产管理对任何企业来说都是一项艰巨的任务&#xff0c;但使用适当的工具可以简化这项任务&#xff0c;例如&#xff0c;IT 资产管理软件可以为简化软件和硬件的管理提供巨大的优势。 什么是 IT 资产管理 IT 资产管理&#xff08;ITAM&#xff09;是一组业务实践&#xff…