在农场土地动态规划中找到最佳路线/Dijkstra的

Find optimal route in farm land-dynamic programming/Dijkstra's

本文关键字:最佳路 Dijkstra 农场 土地 动态规划      更新时间:2023-10-16

我试图在InterviewStreet上解决一个问题(比赛已经结束了)。问题是在给定 N*M 高程网格的情况下,从池塘到农场建造一条沟渠。池塘和农场是 N*M 网格中的图块之一,不会是同一个图块。

高程是介于 0 和 9 之间的数字。此外,您还将获得池塘和农场的坐标(1 索引,行后跟列),每个坐标恰好占用网格上的一个图块。您将编写一个程序,根据此数据,计算建造灌溉沟渠的最低成本。

更具体地说,将馈送到程序中的输入将格式化如下:

尼·

池塘位置X 池塘位置Y

农场位置X 农场位置Y

海拔

X1Y1海拔X1Y2...海拔X1YM

海拔

X2Y1海拔X2Y2...海拔X2YM

.

.

.

海拔

XNY1海拔XNY2...海拔XNYM

其中 pondLocationX 和 farmLocationX 是区间 [1, N] 中的整数,

pondLocationY 和 farmLocationY 是区间 [1, M] 中的整数,所有元素都是区间 [0, 9] 中的整数。请注意,农场和池塘的 X 和 Y 坐标之间只有一个空格分隔,但没有空格分隔高程。

给定这样的输入,您的程序应打印出从池塘到农场的灌溉沟渠的最小成本。约束如下。池塘和农场不会在同一位置。除池塘外,所有切片的高程可以增加或减少,每个变化单位的成本为 1(您可以保持高程不变,成本为 0)。N 和 M 最多为 300。在支付任何必要的挖掘费用后,如果有一系列从池塘开始到农场结束的瓷砖,您可以以 0 额外费用建造沟渠,例如满足以下条件:

  1. 连续路径)序列中的每个图块都与前一个图块相邻(没有对角线邻接 - 地图内部的图块正好有 4 个相邻图块)

  2. 下坡路径)序列中的每个图块(包括池塘和农场)的海拔高度最多等于序列中前一个图块的高度。

例如,如果输入如下:

3 5

1

1

3 4

27310

21171

77721

然后我们可以以 4 的成本建造一条灌溉沟渠,因为它足以将位置 (1, 3) 的瓷砖从 3 降低到 1(成本 2),将位置 (1,

5) 的瓷砖从 0 提高到 1(成本 1),并将位于位置 (3, 4) 的农场从 2 降低到 1(成本 1)。请注意,您不能沿对角线移动以一步从 (2, 3) 到 (3, 4)。

溶液:

我认为这是 Djikstra 算法的变体,即使用农场作为源节点,并在计算到池塘的最短路径时停止。"相邻"切片是相邻的切片,边缘权重是高程的差异。

但是,由于您可以通过两种方式修改权重,即如果您高于邻居,那么您可以 1) 降低您的身高以匹配您的邻居或 2) 增加邻居的身高以匹配您的身高。这种效果可以向外渗透,我无法在算法中捕捉到这一点。

如何调整 Djikstra 的算法以适应权重可以更改的事实?

在 3D 网格 N*M*10 上使用 Dijkstra 算法。如果 (x,y) 和 (x',y') 相邻且 z' 不大于 z,则两个顶点 (x,y,z) 和 (x',y',z') 连接(具有定向弧)。弧上的成本由 z' 和 (x',y' 处的初始高度之差给出)。然后找到从池塘(及其初始长度)到农场的最短路路径(即使 z 坐标不同)。

以这种方式找到的最小路径可能在同一点 (x,y) 上经过两次。例如,它可以首先从 (x,y,z') 传递,然后从 (x,y,z'') 传递。但是,如果发生这种情况,您可以删除从 (x,y,z') 到 (x,y,z'') 的路径,因为将 (x,y,z') 替换为 (x,y,z') 的成本等于或低于从 (x,y,z') 到 (x,y,z'') 的路径。因此,您可以假设对于每个点 (x,y),路径仅使用单个 z 值。

因此,您找到的路径是给定问题的解决方案。