在农场土地动态规划中找到最佳路线/Dijkstra的
Find optimal route in farm land-dynamic programming/Dijkstra's
我试图在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 额外费用建造沟渠,例如满足以下条件:
- (
连续路径)序列中的每个图块都与前一个图块相邻(没有对角线邻接 - 地图内部的图块正好有 4 个相邻图块)
(下坡路径)序列中的每个图块(包括池塘和农场)的海拔高度最多等于序列中前一个图块的高度。
例如,如果输入如下:
3 5
11
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 值。
因此,您找到的路径是给定问题的解决方案。
- 在C#中处理C++指针而不使用unsafe的最佳方法
- 在C++中,将大的无符号浮点数四舍五入为整数的最佳方法是什么
- 实现无开销push_back的最佳方法是什么
- 数到第n个楼梯的路(顺序无关紧要)
- vscode g++链路故障:体系结构x86_64的未定义符号
- 在c代码之间共享数据的最佳方式
- 使用std::source_location报告错误的最佳实践
- 派生类销毁的最佳实践是什么
- 将寄存器设计成可由C和C++访问的外设的最佳实践
- 在两台机器之间进行时间戳的最佳c++chrono函数是什么
- 使用QQuickFramebufferObject时同步数据的最佳方式是什么
- 在C++中向零方向近似的最佳方法
- 使用不同的CRT将新的C++代码与旧的(二进制)组件隔离开来的最佳方法是什么
- 从嵌套在std::映射中的std::列表中删除元素的最佳方式
- 如果条件为TRUE(最佳方式?),则在do while循环中后置增量
- 检测win32服务创建和删除的最佳方法
- 在reactor中存储eventHandlers的最佳方式是什么
- 如何完善Dijkstra算法,而不是找到最佳路径
- 在农场土地动态规划中找到最佳路线/Dijkstra的
- 使用Dijkstra算法找到最佳路径的不可预测的结果