当前位置: 首页 > news >正文

【01最短路 BFS】1368. 使网格图至少有一条有效路径的最小代价

如果有不明白的,请加文末QQ群。

本文涉及知识点

01最短路
C++BFS算法
图论知识汇总

LeetCode 1368. 使网格图至少有一条有效路径的最小代价

给你一个 m x n 的网格图 grid 。 grid 中每个格子都有一个数字,对应着从该格子出发下一步走的方向。 grid[i][j] 中的数字可能为以下几种情况:
1 ,下一步往右走,也就是你会从 grid[i][j] 走到 grid[i][j + 1]
2 ,下一步往左走,也就是你会从 grid[i][j] 走到 grid[i][j - 1]
3 ,下一步往下走,也就是你会从 grid[i][j] 走到 grid[i + 1][j]
4 ,下一步往上走,也就是你会从 grid[i][j] 走到 grid[i - 1][j]
注意网格图中可能会有 无效数字 ,因为它们可能指向 grid 以外的区域。
一开始,你会从最左上角的格子 (0,0) 出发。我们定义一条 有效路径 为从格子 (0,0) 出发,每一步都顺着数字对应方向走,最终在最右下角的格子 (m - 1, n - 1) 结束的路径。有效路径 不需要是最短路径 。
你可以花费 cost = 1 的代价修改一个格子中的数字,但每个格子中的数字 只能修改一次 。
请你返回让网格图至少有一条有效路径的最小代价。
示例 1:
输入:grid = [[1,1,1,1],[2,2,2,2],[1,1,1,1],[2,2,2,2]]
输出:3
解释:你将从点 (0, 0) 出发。
到达 (3, 3) 的路径为: (0, 0) --> (0, 1) --> (0, 2) --> (0, 3) 花费代价 cost = 1 使方向向下 --> (1, 3) --> (1, 2) --> (1, 1) --> (1, 0) 花费代价 cost = 1 使方向向下 --> (2, 0) --> (2, 1) --> (2, 2) --> (2, 3) 花费代价 cost = 1 使方向向下 --> (3, 3)
总花费为 cost = 3.
示例 2:
输入:grid = [[1,1,3],[3,2,2],[1,1,4]]
输出:0
解释:不修改任何数字你就可以从 (0, 0) 到达 (2, 2) 。
示例 3:
输入:grid = [[1,2],[4,3]]
输出:1
示例 4:
输入:grid = [[2,2,2],[2,2,2]]
输出:3
示例 5:
输入:grid = [[4]]
输出:0
提示:
m == grid.length
n == grid[i].length
1 <= m, n <= 100

01最短路

如果方向相同,则距离为0;否则为1。

代码

核心代码

classSolution{public:intminCost(constvector<vector<int>>&grid){constintR=grid.size();constintC=grid[0].size();constintiMaskCount=R*C;intmoves[][2]={{0,0},{0,1},{0,-1},{1,0},{-1,0}};intmaskAdd[]={0,1,-1,C,-C};vector<vector<int>>vNeiBo0(iMaskCount),vNeiBo1(iMaskCount);for(intr=0;r<R;r++){for(intc=0;c<C;c++){constintmask=C*r+c;for(intmove=1;move<=4;move++){intr1=r+moves[move][0];intc1=c+moves[move][1];if((r1<0)||(r1>=R)||(c1<0)||(c1>=C)){continue;}auto&vNeiBo=(grid[r][c]==move)?vNeiBo0:vNeiBo1;vNeiBo[mask].emplace_back(mask+maskAdd[move]);}}}C01BFSDisbfs(vNeiBo0,vNeiBo1,0);returnbfs.m_vDis.back();}};

单元测试

template<classT1,classT2>voidAssertEx(constT1&t1,constT2&t2){Assert::AreEqual(t1,t2);}template<classT>voidAssertEx(constvector<T>&v1,constvector<T>&v2){Assert::AreEqual(v1.size(),v2.size());for(inti=0;i<v1.size();i++){Assert::AreEqual(v1[i],v2[i]);}}template<classT>voidAssertV2(vector<vector<T>>vv1,vector<vector<T>>vv2){sort(vv1.begin(),vv1.end());sort(vv2.begin(),vv2.end());Assert::AreEqual(vv1.size(),vv2.size());for(inti=0;i<vv1.size();i++){AssertEx(vv1[i],vv2[i]);}}namespaceUnitTest{vector<vector<int>>grid;TEST_CLASS(UnitTest){public:TEST_METHOD(TestMethod00){grid={{1,1,1,1},{2,2,2,2},{1,1,1,1},{2,2,2,2}};autores=Solution().minCost(grid);AssertEx(3,res);}TEST_METHOD(TestMethod01){grid={{1,1,3},{3,2,2},{1,1,4}};autores=Solution().minCost(grid);AssertEx(0,res);}TEST_METHOD(TestMethod02){grid={{1,2},{4,3}};autores=Solution().minCost(grid);AssertEx(1,res);}TEST_METHOD(TestMethod03){grid={{2,2,2},{2,2,2}};autores=Solution().minCost(grid);AssertEx(3,res);}TEST_METHOD(TestMethod04){grid={{4}};autores=Solution().minCost(grid);AssertEx(0,res);}};}

扩展阅读

我想对大家说的话
亲士工具箱:支持AutoCad2013及以上
工作中遇到的问题,可以按类别查阅鄙人的算法文章,请点击《算法与数据汇总》。
学习算法:按章节学习《喜缺全书算法册》,大量的题目和测试用例,打包下载。重视操作
活到老,学到老。明朝中后期,大约50%的进士能当上堂官(副部及更高);能当上堂官的举人只有十余人。
子墨子言之:事无终始,无务多业。也就是我们常说的专业的人做专业的事。

视频课程

先学简单的课程,请移步CSDN学院,听白银讲师(也就是鄙人)的讲解。
https://edu.csdn.net/course/detail/38771
如何你想快速形成战斗了,为老板分忧,请学习C#入职培训、C++入职培训等课程
https://edu.csdn.net/lecturer/6176

测试环境

操作系统:win7 开发环境: VS2019C++17
或者 操作系统:win10 开发环境: VS2022C++17
如无特殊说明,本算法用**C++**实现。

http://www.jsqmd.com/news/477193/

相关文章:

  • RLHF在多模态领域的应用:MM-RLHF框架与视觉语言模型对齐技术
  • Taming Transformers完整贡献指南:10个技巧助你成为AI图像合成专家
  • Dolt:将Git与数据库完美结合的开源项目
  • Redis 的用途
  • 如何快速掌握Embark框架:从代码规范到贡献流程的完整指南
  • Vue3商城移动端调试终极指南:Chrome DevTools与Vue DevTools实战技巧
  • Dolt:数据版的Git,让数据库管理更智能
  • Prisma与监控系统:10个性能指标收集和应用监控实现终极指南
  • Gorilla合作伙伴计划:API提供商如何接入生态系统
  • OCRmyPDF与文档扫描标准:符合ISO 19005(PDF/A)的处理
  • 用UE5 Multi-User Editing实现远程团队协作:公网部署+会话管理全流程解析
  • 如何快速掌握AppManager:10个实用技巧提升Android管理效率
  • LeetCode 热题 100 之 215. 数组中的第K个最大元素 347. 前 K 个高频元素 295. 数据流的中位数
  • SecretVault强网杯2025 Web题解:从JWT绕过到HTTP头注入的实战剖析
  • sc-im配置与自定义:打造属于你的终端表格工作流
  • Buildroot+Qt开发:嵌入式GUI应用的快速部署方案
  • 从安装到渲染:MakeHuman完整工作流教程(含Blender导出技巧)
  • OpenVPN 2.5.9 快速部署与多端口转发实战指南
  • PyCaret特征工程:轻松构建专业级特征缩放与选择Pipeline
  • Spring开发系列教程(1)——简介
  • 【从零入门23种设计模式20】行为型之状态模式
  • 瑞芯微RK3568控制板PCB设计实战:从PMU布局到叠层优化的效率提升
  • AI应用落地新范式:从FDE到AgentOps的工程化演进
  • Hugging Face Transformers 介绍
  • vim 提升
  • MATLAB图像去阴影实战:如何用高斯模糊拯救你的背光照片(附完整代码)
  • Spring开发系列教程(2)——IoC容器
  • Arduino+ESP8266获取网络时间全攻略(附阿里云NTP服务器配置)
  • ESP32-CAM+4G DTU:构建远程图像采集与云存储系统
  • 2024年高外观CNC加工厂家权威推荐榜:谁才是真正的颜值担当? - 余文22