1. 题目

给你一个 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

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

2. 解题

  • BFS广度优先搜索,最短路径
  • 将箭头可以走到的地方全部加入队列,并标记访问过
  • 然后将队列里的取出,向4个方向反转路径,并一路添加新的没访问的可走点
class Solution {public:int minCost(vector<vector<int>>& grid) {int m = grid.size(), n= grid[0].size();int i, j, x = 0, y = 0, a, b, k, flip = 0, size;vector<vector<int>> dir = {{0,0},{0,1},{0,-1},{1,0},{-1,0}};vector<vector<bool>> visited(m,vector<bool>(n,false));queue<pair<int,int>> q;while(x>=0 && x<m && y>=0 && y<n && !visited[x][y]){q.push({x,y});visited[x][y] = true;i = x + dir[grid[x][y]][0];j = y + dir[grid[x][y]][1];x = i, y = j;}if(visited[m-1][n-1])return 0;while(!q.empty()){size = q.size();flip++;while(size--){i = q.front().first;j = q.front().second;q.pop();for(k = 1; k <= 4; k++){x = i + dir[k][0];y = j + dir[k][1];while(x>=0 && x<m && y>=0 && y<n && !visited[x][y]){q.push({x,y});visited[x][y] = true;a = x + dir[grid[x][y]][0];b = y + dir[grid[x][y]][1];x = a, y = b;}}}if(visited[m-1][n-1])return flip;}return flip;}
};

LeetCode 1368. 使网格图至少有一条有效路径的最小代价(BFS最短路径,难)相关推荐

  1. LeetCode 2132. 用邮票贴满网格图(DP/二维差分)

    文章目录 1. 题目 2. 解题 1. 题目 给你一个 m x n 的二进制矩阵 grid ,每个格子要么为 0 (空)要么为 1 (被占据). 给你邮票的尺寸为 stampHeight x stam ...

  2. LeetCode 2087. 网格图中机器人回家的最小代价(脑筋急转弯)

    文章目录 1. 题目 2. 解题 1. 题目 给你一个 m x n 的网格图,其中 (0, 0) 是最左上角的格子,(m - 1, n - 1) 是最右下角的格子. 给你一个整数数组 startPos ...

  3. LeetCode 1411. 给 N x 3 网格图涂色的方案数(数学)

    1. 题目 你有一个 n x 3 的网格图 grid ,你需要用 红,黄,绿 三种颜色之一给每一个格子上色,且确保相邻格子颜色不同(也就是有相同水平边或者垂直边的格子颜色不同). 给你网格图的行数 n ...

  4. leetcode 5383. 给 N x 3 网格图涂色的方案数

    leetcode 5383. 给 N x 3 网格图涂色的方案数 来源:力扣(LeetCode) 你有一个 n x 3 的网格图 grid ,你需要用 红,黄,绿 三种颜色之一给每一个格子上色,且确保 ...

  5. Leetcode 1559二维网格图中探测环 技巧DFS|剪枝

    二维网格图中探测环 给你一个二维字符网格数组 grid ,大小为 m x n ,你需要检查 grid 中是否存在 相同值 形成的环. 一个环是一条开始和结束于同一个格子的长度 大于等于 4 的路径.对 ...

  6. Matlab之在城市环境中基于动态占用网格图的的运动规划仿真(附源码)

    目录 一.介绍 二.设置场景和基于网格的跟踪器 三.设置运动规划器 四.结果 五.总结 六.程序 此示例演示如何使用 Frenet 参考路径在城市驾驶场景中执行动态重新规划.在此示例中,将使用本地环境 ...

  7. Acwing 2326:王者之剑(网格图之网络流 最大权独立集)

    原题链接 传送门:Acwing 2326:王者之剑 题目大意 给一个网格图,每个点是宝石的数量,现在从0秒开始可以从任意一个点作为起点开始走,每秒顺序执行下面三件事:1.拿走该点的宝石.2.如果当前是 ...

  8. R语言使用DALEX包的model_performance函数对caret包生成的多个算法模型进行残差分布分析并使用箱图进行残差分布的可视化

    R语言使用DALEX包的model_performance函数对caret包生成的多个算法模型进行残差分布分析并使用箱图进行残差分布的可视化 目录

  9. R语言使用caretEnsemble包的caretList函数一次性构建多个机器学习模型、使用lattice包的bwplot函数使用箱图对比多个模型在多个指标上的性能差异

    R语言使用caretEnsemble包的caretList函数一次性构建多个机器学习模型.并使用caret包的resamples函数比较在同一数据集上多个机器学习模型的比较结果.使用lattice包的 ...

最新文章

  1. Juniper批量新增用户命令工具
  2. python popen函数讲解_Python常用模块函数代码汇总解析
  3. C语言中quot;##quot;的独特用法
  4. 训练日志 2019.4.27
  5. Shiro 身份验证
  6. sublime c语言如何编译,Sublime Text 3 实现C语言代码的编译和运行(示例讲解)
  7. python控制gpio产生固定数量的脉冲_STM32L151用dma控制GPIO口发出指定的脉冲个数的疑惑!...
  8. 01-09 Linux三剑客-sed
  9. 【报告分享】2021年度中国计算机视觉人才调研报告-德勤.pdf(附下载链接)
  10. redis--服务器与客户端
  11. LeetCode:每日一题(2020.4.13)
  12. 前端网页字体优化指南
  13. sis最新ip地址2020入口一_2020云南高考成绩公布时间最新 云南高考查成绩方式入口大全...
  14. preempt_disable导致的cyclictest测试延时超标
  15. Golang sqlx 使用 Where in 解决办法
  16. 唯一插件化Replugin源码及原理深度剖析--插件的安装、加载原理
  17. Redis的5种数据类型与编码结构分析
  18. 如何找国外作者的matlab,如何与外国学者用电子邮件联系(索要论文或者代码)...
  19. 2019年苹果申请邓白氏(和以前(2018年之前)相比多了【确认知悉涵】)
  20. 关于我如何阅读源码这件事...

热门文章

  1. 选择排序 冒泡排序 二分查找
  2. android MPV架构快速实现,不是所有的MPV都叫GL8,一体化智能座舱体验来袭
  3. Windows-server-2008-R2安装Oracle-11g-R2-dataguard
  4. java 检查进程是否存在
  5. MYSQL基础十一--存储引擎
  6. linux-0.11内核 调试教程+GCC源代码
  7. 【Head First Java 读书笔记】(一)基本概念
  8. char、varchar、nchar、nvarchar的区别
  9. Example3_1
  10. 在2008 server安装vm server时发生的错误error1718、error1335……