LeetCode 1293. 网格中的最短路径(DP/BFS)

1. 题目

给你一个 m * n 的网格,其中每个单元格不是 0(空)就是 1(障碍物)。
每一步,您都可以在空白单元格中上、下、左、右移动。

如果您 最多 可以消除 k 个障碍物,请找出从左上角 (0, 0) 到右下角 (m-1, n-1) 的最短路径,并返回通过该路径所需的步数。
如果找不到这样的路径,则返回 -1。

示例 1:
输入: 
grid = 
[[0,0,0],[1,1,0],[0,0,0],[0,1,1],[0,0,0]], 
k = 1
输出:6
解释:
不消除任何障碍的最短路径是 10。
消除位置 (3,2) 处的障碍后,最短路径是 6 。
该路径是 (0,0) -> (0,1) -> (0,2) -> (1,2) -> (2,2) -> (3,2) -> (4,2).示例 2:
输入:
grid = 
[[0,1,1],[1,1,1],[1,0,0]], 
k = 1
输出:-1
解释:
我们至少需要消除两个障碍才能找到这样的路径。提示:
grid.length == m
grid[0].length == n
1 <= m, n <= 40
1 <= k <= m*n
grid[i][j] == 0 or 1
grid[0][0] == grid[m-1][n-1] == 0

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/shortest-path-in-a-grid-with-obstacles-elimination
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

2. 解题

  • dp[i][j][s] 表示到(i,j)位置,消除了s个障碍物的最短步数
  • 先用 BFS搜索跟起点相连的 非障碍物(0),记录每个到达的 0 位置 dp[i][j][0]的步数(BFS的层数)
  • 然后在遍历所有可能的s,遍历所有的位置 i,j,下一个位置状态 ni,nj
  • 如果(grid[ni][nj] && s+1 <= k) 是障碍物, 且还可以搬走
    dp[ni][nj][s+1] = min(dp[ni][nj][s+1], dp[i][j][s]+1)
  • 如果 grid[ni][nj]不是障碍物
    dp[ni][nj][s] = min(dp[ni][nj][s], dp[i][j][s]+1)
class Solution {
public:int shortestPath(vector<vector<int>>& grid, int k) {vector<vector<int>> dir = {{1,0},{0,1},{0,-1},{-1,0}};int m = grid.size(), n = grid[0].size(), i, j, ni, nj, s = 0, d;vector<vector<vector<int>>> dp(m,vector<vector<int>>(n, vector<int>(k+1, INT_MAX)));// dp[i][j][s] 表示到(i,j)位置,消除了s个障碍物的最短步数dp[0][0][0] = 0;vector<vector<bool>> vis(m, vector<bool>(n,false));queue<vector<int>> q;q.push({0,0});vis[0][0] = true;while (!q.empty()) //广度优先查找所有0位置,不用搬走障碍{int size = q.size();while(size--){i = q.front()[0];j = q.front()[1];q.pop();dp[i][j][0] = s;//不用搬走障碍的最短步数for(d = 0; d < 4; ++d){ni = i+dir[d][0];nj = j+dir[d][1];if(ni<0 || ni >= m || nj<0 || nj >= n || vis[ni][nj] || grid[ni][nj])continue;//出界了,访问过,是障碍物q.push({ni,nj});vis[ni][nj] = true;}}s++;}for(s = 0; s <= k; s++){	//障碍物for(i = 0; i < m; i++) {	//位置 ifor(j = 0; j < n; j++){	//位置 jif(dp[i][j][s] == INT_MAX)continue;//状态不能走到,下一个for(d= 0; d < 4; ++d){	//向4个方向移动,下一个坐标ni = i+dir[d][0];nj = j+dir[d][1];if(ni<0 || ni >= m || nj<0 || nj >= n)continue;//出界了,下一个if(grid[ni][nj] && s+1 <= k)//下一个位置为障碍物, 还可以搬走dp[ni][nj][s+1] = min(dp[ni][nj][s+1], dp[i][j][s]+1);else if(!grid[ni][nj])//不是障碍物dp[ni][nj][s] = min(dp[ni][nj][s], dp[i][j][s]+1);}}}}int minstep = INT_MAX;for(s = 0; s <= k; ++s)minstep = min(minstep, dp[m-1][n-1][s]);return minstep==INT_MAX ? -1 : minstep;}
};

640 ms 25.2 MB

  • 或者直接BFS,队列内存储<i, j, 搬运障碍物次数>
class Solution {
public:int shortestPath(vector<vector<int>>& grid, int k) {vector<vector<int>> dir = {{1,0},{0,1},{0,-1},{-1,0}};int m = grid.size(), n = grid[0].size(), i, j, ni, nj, step = 0, curs, d;vector<vector<vector<bool>>> vis(m,vector<vector<bool>>(n, vector<bool>(k+1, false)));queue<vector<int>> q;q.push({0,0,0});// i, j, s障碍物搬了几次vis[0][0][0] = true;while (!q.empty()) {int size = q.size();while(size--){i = q.front()[0];j = q.front()[1];curs = q.front()[2];if(i==m-1 && j==n-1)return step;q.pop();for(d = 0; d < 4; ++d){ni = i+dir[d][0];nj = j+dir[d][1];if(ni<0 || ni >= m || nj<0 || nj >= n)continue;//出界了if(grid[ni][nj] && curs+1 <= k && !vis[ni][nj][curs+1])//是障碍物, 还能搬走{vis[ni][nj][curs+1] = true;q.push({ni,nj,curs+1});}else if(!grid[ni][nj] && !vis[ni][nj][curs])//不是障碍物{vis[ni][nj][curs] = true;q.push({ni,nj,curs});}}}step++;}return -1;}
};

400 ms 41.1 MB

python3 解答

class Solution:def shortestPath(self, grid: List[List[int]], k: int) -> int:import queuedir = [[1,0],[0,1],[0,-1],[-1,0]]m, n = len(grid), len(grid[0])step = 0vis = [[[False]*(k+1) for _ in range(n)] for _ in range(m)]q = queue.Queue(m*n*(k+1))q.put([0,0,0])vis[0][0][0] = Truewhile not q.empty():size = q.qsize()while size > 0:qt = q.get()i = qt[0]j = qt[1]curs = qt[2]if i==m-1 and j==n-1:return stepfor d in range(4):ni = i+dir[d][0]nj = j+dir[d][1]if ni<0 or ni>=m or nj<0 or nj>=n:continueif grid[ni][nj] and curs+1 <= k and not vis[ni][nj][curs+1]:vis[ni][nj][curs+1] = Trueq.put([ni,nj,curs+1])elif not grid[ni][nj] and not vis[ni][nj][curs]:vis[ni][nj][curs] = Trueq.put([ni,nj,curs])size -= 1step += 1return -1

2200 ms 18.5 MB

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

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

相关文章

员工奖金需要交税吗_企业为员工发福利 奖品奖金也需要缴税

原标题&#xff1a;企业为员工发福利 奖品奖金也需要缴税企业的福利待遇经常成为员工炫耀的资本&#xff0c;过生日企业准备了小礼品&#xff0c;各种节日为员工准备的物品&#xff0c;举办不容形式的年会的时候对先进工作者发放奖金、奖品及举行抽奖活动。那么&#xff0c;发放…

天气预报Dom解析(转)

view plain<span style"font-family:Arial, Verdana, sans-serif;color:#000000;"><span style"white-space: normal;"><span style"color:#000099;"> </span></span></span> DOM是用与平台无关和语言无关…

用户行为分析模型-(行为事件分析、用户留存分析、漏斗分析、行为路径分析、用户分群、点击分析)

最近有些忙&#xff0c;但是看到了很好的分析模型也要跟大家分享的&#xff0c;这篇博客有些粗糙&#xff0c;主要是po上一些链接供大家学习&#xff0c;有时间的话&#xff0c;我也会写出自己关于用户行为分析的理解的。 下面是关于用户行为分析常见的分析维度&#xff0c;有…

[scikit-learn 机器学习] 4. 特征提取

文章目录1. 从类别变量中提取特征2. 特征标准化3. 从文本中提取特征3.1 词袋模型3.2 停用词过滤3.3 词干提取和词形还原3.4 TF-IDF 权重扩展词包3.5 空间有效特征向量化与哈希技巧3.6 词向量4. 从图像中提取特征4.1 从像素强度中提取特征4.2 使用卷积神经网络激活项作为特征本文…

webgis 行政图报错_WebGIS 地图 示例源码下载

【实例简介】【实例截图】【核心代码】esri Deomhtml, body, #map {height: 100%;width: 100%;}body {background-color: #fff;overflow: hidden;}#BasemapToggle {position: absolute;right: 20px;top: 20px;z-index: 50;}#HomeButton {left: 25px;position: absolute;top: 93…

正则表达式 - 去掉乱码字符/提取字符串中的中文字符/提取字符串中的大小写字母 - Python代码

目录 1.乱码符号种类较少&#xff0c;用replace() 2.乱码字符种类较多&#xff0c;用re.sub() 3.提取字符串中的中文字符 4.提取字符串中的中文字符和数字 5.提取其他 数据清洗的时候一大烦恼就是数据中总有各种乱码字符&#xff0c;比如&#xff01;#&#xffe5;%……&a…

《JavaScript高级程序设计》阅读笔记(一):ECMAScript基础

2.1 语法 区分大小写、变量弱类型、行尾分号可有可无、注释为双斜线、括号表明代码块 2.2 变量 变量用var声明&#xff0c;变量的命名规则&#xff1a;第一个字符必须是字母、下划线或美元符号&#xff1b;余下的字符可以是下划线、美元符号或任何字母或数字字符。 变量命名规范…

v8引擎和v12引擎_为什么V8和V12发动机至今还存在,而V10发动机却早早被淘汰了?...

为什么V8和V12发动机至今还存在&#xff0c;而V10发动机却早早被淘汰了&#xff1f;估计你看到标题的时候心中已经有了相关的答案&#xff0c;但是如果我说你所想的和真实的原因并不一样呢&#xff01;随着国家对环保越来越重视&#xff0c;大排量发动机逐渐也成为了汽车工业中…

LeetCode 第 29 场双周赛(890/2259,前39.4%)

文章目录1. 比赛结果2. 题目1. LeetCode 5432. 去掉最低工资和最高工资后的工资平均值 easy2. LeetCode 5433. n 的第 k 个因子 medium3. LeetCode 5434. 删掉一个元素以后全为 1 的最长子数组 medium4. LeetCode 5435. 并行课程 II hard1. 比赛结果 做出来了3道题。第三题卡了…

Hive关于数据库的增删改查

创建库 if not exists&#xff1a;防止db_hive已经存在 CREATE DATABASE if not exists db_hive;CREATE DATABASE if not exists db_hive COMMENT create my database named db_hive;#带注释CREATE DATABASE if not exists db_hive WITH dbproperties(aaaa,bbbb);#带属性 使…

【dll 返回字符串 】2

【vc <--> vc】返回void* 类型void* __stdcall torrent_hash( const char *TorrentFilePath){char szText[41]{0};if(strcmp(TorrentFilePath,"") 0 || TorrentFilePath NULL)return NULL;string strHashString "abcdefg"; sprintf(szText,&qu…

Hive关于数据表的增删改(内部表、外部表、分区表、分桶表 数据类型、分隔符类型)

建表 基本语句格式 CREATE [external] TABLE if not exists student #默认建立内部表&#xff0c;加上external则是建立外部表(id int COMMENT学号,sname string COMMENT用户名,age int COMMENT年龄)#字段名称&#xff0c;字段类型&#xff0c;字段描述信息 COMMENT 记录学生…

LeetCode 1496. 判断路径是否相交(set)

1. 题目 给你一个字符串 path&#xff0c;其中 path[i] 的值可以是 ‘N’、‘S’、‘E’ 或者 ‘W’&#xff0c;分别表示向北、向南、向东、向西移动一个单位。 机器人从二维平面上的原点 (0, 0) 处开始出发&#xff0c;按 path 所指示的路径行走。 如果路径在任何位置上出…

python数据框循环生成_python - 如何在 Pandas 的for循环迭代中创建多个数据框?

我需要在熊猫中创建一个函数&#xff0c;该函数将单个数据框作为输入&#xff0c;并根据特定条件返回多个数据框作为输出。 (请检查下面的示例以了解情况)。我很难弄清楚如何做。我需要一些专家的编码建议。范例1&#xff1a;输入 100列的数据框输出数据帧1的前10&#xff05;列…

除去数组中的空字符元素array_filter()

除去数组中的空字符元素 <?php$str1_arrayarray(电影618,,http://www.movie618.com,,1654,);$str1_arrayarray_filter($str1_array);print_r($str1_array); ?> 显示结果&#xff1a; Array( [0] > 电影618 [2] > http://www.movie618.com [4] > …

Hive的数据加载与导出

普通表的加载 1.load方式 load data [local] inpath [源文件路径] into table 目标表名; 从HDFS上加载数据&#xff0c;本质上是移动文件所在的路径 load data inpath /user/student.txt into table student; 从本地加载数据&#xff0c;本质上是复制本地的文件到HDFS上 lo…

电压压力蕊片_一文让你知道什么是压力变送器

一般来说&#xff0c;压力变送器主要由测压元件传感器(也称作压力传感器)、测量电路和过程连接件三部分组成。它能将测压元件传感器感受到的气体、液体等物理压力参数转变成标准的电信号(如4~20mADC等)&#xff0c;以供给指示报警仪、记录仪、调节器等二次仪表进行测量、指示和…

LeetCode 1497. 检查数组对是否可以被 k 整除(余数配对)

1. 题目 给你一个整数数组 arr 和一个整数 k &#xff0c;其中数组长度是偶数&#xff0c;值为 n 。 现在需要把数组恰好分成 n / 2 对&#xff0c;以使每对数字的和都能够被 k 整除。 如果存在这样的分法&#xff0c;请返回 True &#xff1b;否则&#xff0c;返回 False 。…

C# 多线程编程 ThreadStart ParameterizedThreadStart

原文地址&#xff1a;http://club.topsage.com/thread-657023-1-1.html 在实例化Thread的实例&#xff0c;需要提供一个委托&#xff0c;在实例化这个委托时所用到的参数是线程将来启动时要运行的方法。在.net中提供了两种启动线程的方式&#xff0c;一种是不带参数的启动…

Hive的查找语法

基本语法格式&#xff1a; select [all | DISTINCT ] a.id, a.sname, a.age from student a join student02 b on a.id b.id # 匹配函数 where a.age >18 # 条件语句 group by a.age having a.age >18 # 分组,having:分组后的筛选条件 order by a.age # 全局排序 sort …