【力扣】980. 不同路径Ⅲ

以下为力扣官方题解,及本人代码

980. 不同路径Ⅲ

  • 题目
    • 题意
    • 示例 1
    • 示例 2
    • 示例 3
    • 提示
  • 官方题解
    • 回溯
      • 思路
      • 复杂度
  • 本人代码
    • Java
    • 提交结果:通过

题目

题意

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

  • 1 1 1 表示起始方格。且只有一个起始方格。
  • 2 2 2 表示结束方格,且只有一个结束方格。
  • 0 0 0 表示我们可以走过的空方格。
  • − 1 -1 1 表示我们无法跨越的障碍。

返回在四个方向(上、下、左、右)上行走时,从起始方格到结束方格的不同路径的数目。
每一个无障碍方格都要通过一次,但是一条路径中不能重复通过同一个方格。

示例 1

输入 [ [ 1 , 0 , 0 , 0 ] , [ 0 , 0 , 0 , 0 ] , [ 0 , 0 , 2 , − 1 ] ] [[1,0,0,0],[0,0,0,0],[0,0,2,-1]] [[1,0,0,0],[0,0,0,0],[0,0,2,1]]
输出 2 2 2
解释:我们有以下两条路径:
1. ( 0 , 0 ) , ( 0 , 1 ) , ( 0 , 2 ) , ( 0 , 3 ) , ( 1 , 3 ) , ( 1 , 2 ) , ( 1 , 1 ) , ( 1 , 0 ) , ( 2 , 0 ) , ( 2 , 1 ) , ( 2 , 2 ) 1. (0,0),(0,1),(0,2),(0,3),(1,3),(1,2),(1,1),(1,0),(2,0),(2,1),(2,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. (0,0),(1,0),(2,0),(2,1),(1,1),(0,1),(0,2),(0,3),(1,3),(1,2),(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 ] ] [[1,0,0,0],[0,0,0,0],[0,0,0,2]] [[1,0,0,0],[0,0,0,0],[0,0,0,2]]
输出 4 4 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 ) 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) 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 ) 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) 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 ) 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) 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 ) 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) 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],[2,0]] [[0,1],[2,0]]
输出 0 0 0
解释:没有一条路能完全穿过每一个空的方格一次。
请注意,起始和结束方格可以位于网格中的任意位置。

提示

  • 1 < = g r i d . l e n g t h ∗ g r i d [ 0 ] . l e n g t h < = 20 1 <= grid.length * grid[0].length <= 20 1<=grid.lengthgrid[0].length<=20

官方题解

回溯

思路

按照要求,假设矩阵中有 n n n 0 0 0,那么一条合格的路径,是长度为 ( n + 1 ) (n+1) (n+1),由 1 1 1 起始,结束于 2 2 2,不经过 − 1 -1 1,且每个点只经过一次的路径。
要求出所有的合格的路径,可以采用回溯法,定义函数 d f s dfs dfs ,表示当前 g r i d grid grid 状态下,从点 ( i , j ) (i,j) (i,j) 出发,还要经过 n n n 个点,走到终点的路径条数。
到达一个点时,

  • 如果当前的点为终点,且已经经过了 ( n + 1 ) (n+1) (n+1) 个点,那么就构成了一条合格的路径,否则就不构成。
  • 如果当前的点不为终点,则将当前的点标记为 − 1 -1 1,表示这条路径以后不能再经过这个点,然后继续在这个点往四个方向扩展,如果不超过边界且下一个点的值为 0 0 0 或者 2 2 2,则表示这条路径可以继续扩展。

探测完四个方向后,需要将当前的点的值改为原来的值。
将四个方向的合格路径求和,即为当前状态下合格路径的条数。
最终需要返回的是, g r i d grid grid 在初始状态下,从起点出发,需要经过 ( n + 1 ) (n+1) (n+1) 个点的路径条数。

复杂度

  • 时间复杂度:O(4^(r * c)),其中 r r r c c c 分别是 g r i d grid grid 的行数和列数。
  • 空间复杂度:O(r * c),是回溯的深度。

本人代码

Java

class Solution {public int uniquePathsIII(int[][] grid) {//获取路径总长度 n 和起始坐标 (x, y)int n = 0, x = 0, y = 0;for (int i = 0; i < grid.length; i++) {for (int j = 0; j < grid[i].length; j++) {if (grid[i][j] == 0) {n++;} else if (grid[i][j] == 1) {x = i;y = j;n++;}}}//开始递归寻路return dfs(x, y, n, grid);}public int dfs(int x, int y, int n, int[][] grid) {//防止越界和躲开障碍if (x < 0 || x >= grid.length || y < 0 || y >= grid[x].length || grid[x][y] == -1) {return 0;}//如果已经到达终点,并且剩余路径长度为 0//即已经找到一条符合要求的路径if (grid[x][y] == 2) {return n == 0 ? 1 : 0;}//记录路径数量int res = 0;//将走过的路置为 -1,不可再次通过int t = grid[x][y];grid[x][y] = -1;//往四个方向寻路res += dfs(x - 1, y, n - 1, grid);res += dfs(x + 1, y, n - 1, grid);res += dfs(x, y - 1, n - 1, grid);res += dfs(x, y + 1, n - 1, grid);//将走过的路重置为通路,不影响后面寻路grid[x][y] = t;return res;}
}

提交结果:通过

  • 执行用时: 0 m s 0ms 0ms
  • 内存消耗: 38.8 M B 38.8MB 38.8MB

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

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

相关文章

弘扬“两弹一星”精神,勇攀科学技术高峰——道本科技商业大学党日活动圆满落幕

2023年8月2日&#xff0c;道本科技与商业大学携手举办了一场主题为“弘扬‘两弹一星’精神&#xff0c;勇攀科学技术高峰”的党日活动。本次活动旨在了解党领导下的中国核工业发展历程&#xff0c;传承和弘扬“两弹一星”精神&#xff0c;同时展示道本科技创新产品&#xff0c;…

【SA8295P 源码分析】60 - QNX Host 如何新增 android_test 分区给 Android GVM 挂载使用

【SA8295P 源码分析】60 - QNX Host 如何新增 android_test 分区给 Android GVM 挂载使用 一、QNX 侧:创建分区、配置下载、配置透传1.1 修改分区表,新增 android_test 分区,大小为 2GByte1.2 配置下载 android_test.img 镜像1.3 配置 /dev/disk/android_test_a 分区透传到 …

ThinkPHP5使用phpqrcode生成二维码

生成指定跳转地址二维码图片&#xff1a; 首先将下载好的phpqrcode.php文件放到指定目录内&#xff08;我这里用的放在public/phpqrcode目录下&#xff09;&#xff0c;准备调用 之后控制器中调用 public function qrcode(){require_once "./phpqrcode/phpqrcode.php&quo…

opencv-33 图像平滑处理-中值滤波cv2.medianBlur()

中值滤波是一种常见的图像处理滤波技术&#xff0c;用于去除图像中的噪声。它的原理是用一个滑动窗口&#xff08;也称为卷积核&#xff09;在图像上移动&#xff0c;对窗口中的像素值进行排序&#xff0c;然后用窗口中像素值的中值来替换中心像素的值。这样&#xff0c;中值滤…

rust match表达式

文章目录 match使用match语法糖【if let】匹配Option<T> match使用 在rust中提供了一个极为强大的控制流运算符match match允许一个值与一系列模式进行匹配&#xff0c;并执行匹配的模式对应的代码这些模式可以是子面值、变量名、通配符等等 来个例子 fn main() {pri…

SHELL——备份脚本

编写脚本&#xff0c;使用mysqldump实现分库分表备份。 1、获取分库备份的库名列表 [rootweb01 scripts]# mysql -uroot -p123456 -e "show databases;" | egrep -v "Database|information_schema|mysql|performance_schema|sys" mysql: [Warning] Using …

尚医通总结(面试模板篇)

视频&#xff1a; 笔记&#xff1a; 一、 项目介绍 尚医通即为网上预约挂号系统&#xff0c;网上预约挂号是近年来开展的一项便民就医服务&#xff0c;旨在缓解看病难、挂号难的就医难题&#xff0c;许多患者为看一次病要跑很多次医院&#xff0c;最终还不一定能保证看得上医生…

游戏开发人员如何从 Splashtop 中受益

游戏开发时代在不断发展&#xff0c;远程办公、协作和高性能需求变得越来越普遍。因此&#xff0c;对复杂工具的需求不断增加&#xff0c;这些工具不仅可以满足这些需求&#xff0c;还可以为开发人员提供无缝体验。 其中一个工具是 Splashtop Business Access Performance&…

互联网——根服务器

说明 根服务器是互联网域名系统&#xff08;DNS&#xff09;中最高级别的服务器之一。它们负责管理整个DNS系统的顶级域名空间&#xff0c;例如.com、.org和.net等。 根服务器的主要功能是将用户的DNS查询转发到适当的顶级域名服务器。当用户在浏览器中输入一个域名&#xff…

Linux nohup 命令详解

nohup是Linux/Unix系统中非常有用的命令之一。它允许您在后台运行命令或脚本&#xff0c;并且在退出终端会话后仍然保持运行。这对于长时间运行的任务或进程非常有用&#xff0c;特别是当您需要离开终端但希望任务继续运行时。 nohup命令语法 nohup命令的基本语法如下&#x…

Redis持久化两种方案以及对比差异

1.1.RDB持久化 RDB全称Redis Database Backup file&#xff08;Redis数据备份文件&#xff09;&#xff0c;也被叫做Redis数据快照。简单来说就是把内存中的所有数据都记录到磁盘中。当Redis实例故障重启后&#xff0c;从磁盘读取快照文件&#xff0c;恢复数据。快照文件称为R…

2023网络安全学习路线 非常详细 推荐学习

首先咱们聊聊&#xff0c;学习网络安全方向通常会有哪些问题 1、打基础时间太长 学基础花费很长时间&#xff0c;光语言都有几门&#xff0c;有些人会倒在学习 linux 系统及命令的路上&#xff0c;更多的人会倒在学习语言上&#xff1b; 2、知识点掌握程度不清楚 对于网络安…

微信多开(双开三开均可,且不局限于微信,其他设备亦可)

1.鼠标右键“微信”&#xff0c;属性 如上图&#xff0c;自动选取的&#xff0c;别动&#xff0c;然后CtrlC,,,,结果如下 "C:\Program Files (x86)\Tencent\WeChat\WeChat.exe" 2.创建文本&#xff0c;电脑桌面空白处单击&#xff0c;新建&#xff0c;文本档案&#…

小白玩转浏览器开发者工具—F12(超详细)

目录 1、检查元素&#xff1a;&#x1f680; 2、修改样式&#xff1a;&#x1f6eb; 3、调试代码&#xff1a;&#x1f451; 4、网络分析&#xff1a;&#x1f682; 5、控制台输出&#xff1a;&#x1f681; 6、移动设备模拟&#xff1a;&#x1f3a8; 7、缓存管理&…

“单片机定时器:灵活计时与创新功能的关键“

学会定时器的使用对单片机来说非常重要&#xff0c;因为它可以帮助实现各种时序电路。时序电路在工业和家用电器的控制中有广泛的应用。 举个例子&#xff0c;我们可以利用单片机实现一个具有按钮控制的楼道灯开关。当按钮按下一次后&#xff0c;灯会亮起并持续3分钟&#xff…

FFmpeg常见命令行(一):FFmpeg工具使用基础

前言 在Android音视频开发中&#xff0c;网上知识点过于零碎&#xff0c;自学起来难度非常大&#xff0c;不过音视频大牛Jhuster提出了《Android 音视频从入门到提高 - 任务列表》。本文是Android音视频任务列表的其中一个&#xff0c; 对应的要学习的内容是&#xff1a;FFmpe…

无涯教程-Lua - 条件判断

if结构要求程序员确定一个或多个要由程序判断或测试的条件&#xff0c;以及要确定的条件为真的情况下要执行的一条或多条语句&#xff0c;如果条件为真&#xff0c;则执行指定语句&#xff0c;如果条件为假&#xff0c;则执行其他语句。 Lua编程语言假定布尔值 true 和 non-nil…

华为、阿里巴巴、字节跳动 100+ Python 面试问题总结(六)

系列文章目录 个人简介&#xff1a;机电专业在读研究生&#xff0c;CSDN内容合伙人&#xff0c;博主个人首页 Python面试专栏&#xff1a;《Python面试》此专栏面向准备面试的2024届毕业生。欢迎阅读&#xff0c;一起进步&#xff01;&#x1f31f;&#x1f31f;&#x1f31f; …

Linux systemctl 简单介绍与使用

在Linux下&#xff0c;systemctl是一个管理系统服务的命令。它提供了对systemd服务的控制和管理。 在系统中使用systemctl命令&#xff0c;您可以执行以下操作&#xff1a; 启动服务&#xff1a;systemctl start servicename停止服务&#xff1a;systemctl stop servicename重…

【2023】Git版本控制-远程仓库详解

目录 创建远程仓库向远程仓库推送数据文件从第二台主机本地拉取远程仓库数据第一台主机同步远程仓库数据tag标签git忽略文件 Git远程仓库是Git版本控制系统的一个概念&#xff0c;它是一个存储Git代码的远程服务器。 你可以将本地Git仓库上传到远程仓库&#xff0c;以便与其他…