由 Leetcode 1368nullhttps://leetcode-cn.com/problems/minimum-cost-to-make-at-least-one-valid-path-in-a-grid/
回顾Dijkstra算法
题目:
给你一个 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 的代价修改一个格子中的数字,但每个格子中的数字 只能修改一次 。
请你返回让网格图至少有一条有效路径的最小代价。
来源:力扣(LeetCode)
题目分析:
可以采用Dijkstra算法求解,关于该算法:
1.Dijkstra算法可以用于求带权图的最小权重路径。
2.依赖优先队列对节点进行处理并更新状态,按权值递增排列,需要辅助数组来记录进行到当前时刻各节点的状态。
(是否访问,权值,前置节点(可选))
3.关键信息为,当前时刻,任一节点由起始节点而来的最小权重值和,以及该路径对应的前置节点。(如某节点还未被检索过,默认值可设为INTMAX)
4.首先将其实节点插入队列,并处理该节点,搜索与之相连的节点,更新其状态(权值,前直接点)并将其插入优先队列。标记被处理过的节点为已访问。
5.当队列队首位置为目标节点时,对应权值和即为目标节点
几点思考:
1.优先队列确保处理节点的顺序严格按照路径权值的非递减方向进行(插队)。
2.检索过程中,一个节点可能多次入队,无论入队时间先后,必然按权值大小排列,并且该权值必然大于或等于当前时刻正在检索的节点的权值数。当真正检索至该节点时必然是已经找到途径该节点的最优路径。
3.基于(2):对于访问状态的标记需要在真正检索到该节点时进行,对于访问状态的判断也必须在检索到该节点时进行,而不是在入队之前,因为之后仍可能以更小权值入队。
其他解法:
启发式搜索:
(稍后更新)