每日OJ题_DFS爆搜深搜回溯剪枝⑧_力扣980. 不同路径 III

embedded/2024/10/22 14:41:35/

目录

力扣980. 不同路径 III

解析代码


力扣980. 不同路径 III

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)

示例 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
class Solution {
public:int uniquePathsIII(vector<vector<int>>& grid) {}
};

解析代码

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

class Solution {int dx[4] = {0, 0, 1, -1};int dy[4] = {1, -1, 0, 0};bool vis[20][20];int m, n, ret, step = 2; // step是总共要走的步数,算上终点和起点public:int uniquePathsIII(vector<vector<int>>& grid) {m = grid.size(), n = grid[0].size();int x = 0, y = 0;for(int i = 0; i < m; ++i){for(int j = 0; j < n; ++j){if(grid[i][j] == 0)++step; // 遇到一个0,要走的步数+1else if(grid[i][j] == 1)x = i, y = j; // 记录起始位置}}vis[x][y] = true;dfs(grid, x, y, 1); // 起点算一个步数了return ret;}void dfs(vector<vector<int>>& grid, int i, int j, int cnt){if(grid[i][j] == 2){if(step == cnt)++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 && grid[x][y] != -1 && !vis[x][y]){vis[x][y] = true;dfs(grid, x, y, cnt + 1);vis[x][y] = false;}}}
};


http://www.ppmy.cn/embedded/33632.html

相关文章

leetCode71. 简化路径

leetCode71. 简化路径 代码 // 化简&#xff1a;就是把所有的., .. // 去掉弄成进入想进的目录&#xff0c;且结果最后不能有/ // 实现思路&#xff1a; 本质上是一个栈&#xff0c;就是进栈出栈的一个模拟实现 class Solution { public:string simplifyPath(string path) {//…

基于 Dockerfile 部署 LNMP 架构

目录 前言 1、任务要求 2、Nginx 镜像创建 2.1 建立工作目录并上传相关安装包 2.2 编写 Nginx Dockerfile 脚本 2.3 准备 nginx.conf 配置文件 2.4 生成镜像 2.5 创建 Nginx 镜像的容器 2.6 验证nginx 3、Mysql 镜像创建 3.1 建立工作目录并上传相关安装包 3.2 编写…

SQL 基础 | JOIN 操作介绍

在SQL中&#xff0c;JOIN是一种强大的功能&#xff0c;用于将两个或多个表中的行结合起来&#xff0c;基于相关的列之间的关系。 JOIN操作通常用在SELECT语句中&#xff0c;以便从多个表中检索数据。 以下是几种基本的JOIN类型以及它们的用法&#xff1a; INNER JOIN&#xff1…

Web Storage 笔记12 操作购物车

相关内容&#xff1a;购物车实例 WebStorage存储空间足够大&#xff0c;访问都在客户端(Client)完成。有些客户端先处理或检查数据&#xff0c;就可以直接使用WebStorage进行存储&#xff0c;不仅可以提高访问速度&#xff0c;还可以降低服务器的练习。负担。例如&#xff0c;购…

写一个在创建css文件之后的初始化样式

创建CSS文件后&#xff0c;进行初始化样式是一个很好的做法&#xff0c;因为它可以消除不同浏览器之间的默认样式差异&#xff0c;使得页面在不同浏览器中表现得更一致。下面是一个简单的CSS初始化样式示例&#xff1a; css /* 初始化样式 */ /* 清除内外边距 */ * { mar…

力扣数据库题库学习(5.4日)--1661. 每台机器的进程平均运行时间

1661. 每台机器的进程平均运行时间 问题链接 解题思路 现在有一个工厂网站由几台机器运行&#xff0c;每台机器上运行着 相同数量的进程 。编写解决方案&#xff0c;计算每台机器各自完成一个进程任务的平均耗时。 完成一个进程任务的时间指进程的’end’ 时间戳 减去 ‘sta…

css基础之盒子模型、浮动问题

盒子模型 一、盒子模型的组成 border边框、content内容、padding内边距、margin外边距(与另外盒子的距离) 1.边框 border-width border-style: solid实线 border-style: dashed虚线 border-style: dotted点线 border-color border: 1pxx solid pink;复合写法&#xff0c;无…

【小浩算法 cpp题解】层次遍历与BFS

层次遍历与BFS 前言我的思路思路一&#xff1a;队列思路二 递归 我的代码运行结果 前言 二叉树的层次遍历应该是数据结构里面最基础的算法了&#xff0c;比较容易想到的就是用队列,刚好C的模板库里面也有queue这个数据结构&#xff0c;入队出队已经给我们实现好了&#xff0c;…