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

news2024/11/27 20:27:01

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; // 回溯,将下一个位置标记为未访问
            }
        }
    }
};

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

提高软件测试覆盖率的5个重点

软件测试覆盖率是软件测试中的一个重要指标&#xff0c;它有利于保障软件质量、提高软件可靠性和可维护性。软件测试覆盖率能够发现并修复代码缺陷&#xff0c;确保代码的正确性&#xff0c;提高软件的稳定性&#xff0c;降低成本和风险。 因此进一步提高软件测试覆盖率对于软件…

weblogic漏洞修复打补丁

序号漏洞名称加固建议1Oracle Fusion Middleware Oracle WebLogic Server组件安全漏洞(CVE-2017-10352)http://www.oracle.com/technetwork/security-advisory/cpuoct2017-3236626.html2Oracle Fusion Middleware和Oracle WebLogic Server 输入验证错误漏洞(CVE-2021-35617)htt…

Python武器库开发-flask篇之flask框架的安装(二十一)

Flask介绍 Flask是一个基于Python开发并且依赖jinja2模板和Werkzeug WSGI服务的一个微型框架&#xff0c;对于Werkzeug本质是Socket服务端&#xff0c;其用于接收http请求并对请求进行预处理&#xff0c;然后触发Flask框架&#xff0c;开发人员基于Flask框架提供的功能对请求进…

【科研新手指南2】「NLP+网安」相关顶级会议期刊 投稿注意事项+会议等级+DDL+提交格式

「NLP网安」相关顶级会议&期刊投稿注意事项 写在最前面一、会议ACL (The Annual Meeting of the Association for Computational Linguistics)IH&MMSec (The ACM Workshop on Information Hiding, Multimedia and Security)CCS (The ACM Conference on Computer and Co…

识别代理IP:保障网络安全的重要一环

在互联网的世界中&#xff0c;代理服务器被广泛用于隐藏用户真实IP地址&#xff0c;带来了一些挑战&#xff0c;特别是在网络安全和欺诈检测方面。本文将探讨如何识别代理IP&#xff0c;以确保网络的安全性和可靠性。 1. 代理IP的背景与用途 代理服务器是位于用户和目标服务器…

各路大神献出自定义GPTs,24小时Top名单

没有 GPTs 做不到的&#xff0c;只有你想不到的。 11 月 10 日凌晨&#xff0c; OpenAI 上线 GPTs&#xff0c;所有的 ChatGPT Plus 订阅用户都可以自己定制 GPT&#xff0c;无需任何编码知识&#xff0c;在聊天过程中就构建好了。 发布当天&#xff0c;OpenAI CEO 山姆・奥特曼…

安卓调用手机邮箱应用发送邮件

先来看看实现效果&#xff1a; 也不过多介绍了&#xff0c;直接上代码&#xff1a; private void openMail() {Uri uri Uri.parse("mailto:" "");List<ApplicationInfo> applicationInfoList getPackageManager().getInstalledApplications(Packa…

XMind 2023 mac/win:引领思维导图革命,让思维更直观、更高效!

XMind是一款引领思维导图的革命性软件&#xff0c;以其强大的功能和高效的操作体验&#xff0c;赢得了全球用户的广泛喜爱。作为一款思维导图软件&#xff0c;XMind将复杂的思维过程和想法以直观、清晰的方式呈现出来&#xff0c;让用户能够更好地理解、组织和表达自己的思想。…

Git推送本地代码到远程仓库

Git推送本地代码到远程仓库 1、首先需要安装Git&#xff0c;如果已经安装&#xff0c;请跳过。下载地址&#xff1a;https://git-for-windows.github.io/ 2、安装好git服务器后。首先找到你项目的文件夹&#xff0c;比如项目名称为Item&#xff0c;进入到这个文件夹&#xff0…

5 个基本步骤,学会创建自己的CRM流程

客户关系管理 (CRM) 系统是必备的客户数据库工具&#xff0c;用于跟踪潜在客户、现有客户、接触点等。使用可靠的技术来跟踪所有客户数据固然重要&#xff0c;但为该技术制定的流程更为关键。因这是用来管理客户和整个客户生命周期的策略。 什么是CRM流程&#xff1f; CRM流程…

SpringBoot从零到一项目实战落地博客系统(附源码!!!)

1.项目内容 1.1.页面展示 1.2.博客分类 1.3.面试辅导 1.4.私教带徒 1.5.文章编辑 1.6.后台管理 2.项目架构及技术描述 2.1.本项目用到的技术和框架 项目构建&#xff1a;Mavenweb框架&#xff1a;Springboot数据库ORM&#xff1a;Mybatis数据库连接池&#xff1a; HikariCP分…

MySQL锁机制详解

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

设备管理平台能做什么?企业如何做好设备维护管理工作?

在当今高度数字化的时代&#xff0c;企业运营离不开各种设备的支持。如何确保这些设备高效运转&#xff0c;降低故障率&#xff0c;成为了企业运营的关键问题。为此&#xff0c;设备管理平台应运而生&#xff0c;它借助数字化、移动互联网等技术&#xff0c;为企业提供全方位的…

kube-bench-CIS基准的自动化扫描工具学习

仓库地址&#xff1a;GitHub - aquasecurity/kube-bench: Checks whether Kubernetes is deployed according to security best practices as defined in the CIS Kubernetes Benchmark kube-bench,检查 Kubernetes 是否根据 CIS Kubernetes 基准中定义的安全最佳实践部署,下载…

%与floormod方法区别

%求余数 计算步骤&#xff1a; 10 / -3 -3.333333........... %是向0方向取整&#xff0c;因此-3.3333.......取整数-3 10 % -3 10-&#xff08;-3*-3&#xff09; 1 floormod方法 计算步骤&#xff1a;floormod(10,-3) floormod是向负无穷方向取整&#xff0c;因此-3…

C#使用时序数据库 InfluxDB

一、安装 https://docs.influxdata.com/influxdb/v2/install/?tWindows 解压后使用cmd运行 访问 localhost:8086 配置 第一次登入会初始化 配置登入账号 保存TOKEN 这个TOKEN用于后期代码链接访问数据库&#xff0c;忘记了只能删除重新生成 点击QUCK START进入管理页面 …

全球市场的新趋势:海外网红营销和私域流量的共同驱动

在数字时代的今天&#xff0c;随着全球互联网的蓬勃发展&#xff0c;网络营销已经不再是一种新鲜事物。然而&#xff0c;随着社交媒体和在线内容创作的兴起&#xff0c;一种新的营销方式崭露头角&#xff0c;它将海外网红营销与私域流量相结合&#xff0c;成为了全球市场的一股…

Leetcode 236 二叉树的最近公共祖先

/*** Definition for a binary tree node.* public class TreeNode {* int val;* TreeNode left;* TreeNode right;* TreeNode(int x) { val x; }* }*///用f(x)表示x节点的子树是否包含p或者q//则满足公共祖先节点有两种情况组成//1.f(x.left) && f(x…

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…

后端接口性能优化分析-2

常见思路 1.批量思想&#xff1a; 这个其实是一个最容易想到的代码层次的修改&#xff0c;其实对业务上来说&#xff0c;结果都是一样的&#xff0c;只不过这个涉及到了一件事就是&#xff0c;像数据库中发请求&#xff0c;是发十次还是发一次的问题。其原因最根本的还是&…