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

时间:2013-09-22 06:48:30

标签: c++ algorithm dynamic-programming dijkstra

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

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

更具体地说,输入程序的输入格式如下:

N M

pondLocationX pondLocationY

farmLocationX farmLocationY

... elevationX1Y1elevationX1Y2 elevationX1YM

... elevationX2Y1elevationX2Y2 elevationX2YM

... elevationXNY1elevationXNY2 elevationXNYM

其中pondLocationX和farmLocationX是区间[1,N]中的整数,而pondLocationY和farmLocationY是区间[1,M]中的整数,并且所有元素都是区间[0,9]中的整数。请注意,单个空格用于分隔农场和池塘的X和Y坐标,但没有空格分隔高程。

鉴于这样的输入,您的计划应该打印出从池塘到农场建造灌溉沟渠的最低成本。约束如下。池塘和农场不在同一个地方。除了池塘之外的所有瓷砖的高度可以增加或减少,每个变化单位的成本为1(您可以将高程保持相同,成本为0)。 N和M各自最多300.在支付任何必要的挖掘费用之后,如果从池塘开始到农场结束的一系列瓷砖,您可以建造一个额外成本的沟渠,以便以下是真实的:

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

  2. (下坡路径)序列中的每个图块(包括池塘和农场)的高程最多为序列中上一个图块的高度。

  3. 例如,如果输入如下:

    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的算法以适应重量可以改变的事实?

1 个答案:

答案 0 :(得分:1)

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

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

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