【发布时间】:2021-02-12 11:13:11
【问题描述】:
我很难找到正确的编码方法。
取一个随机生成的二维数组,大约 50x50,每个单元格的值是 1~99。
从随机位置“绿色”开始,目标是用最少的动作包围目标“红色”。
移动到相邻单元格需要 1~99 个动作,具体取决于它的值。
低值的小数组示例:
[
目前我最好的想法是,根据目标的对角线生成 4 组检查点,然后使用大量 Dijkstra 找到一条通过所有这些检查点的路径以及起点。
我遇到的一个问题是这很快就会变成极端数量的路径。
从“NorthWest-1 到 NW-20”的任何起点到“NE-1 到 NE-20”的任何终点,有 400 种可能性。将第 3 和第 4 对角线相加后变为 400 * 20 * 20。
使用对角检查点的另一个问题是问题不是[从绿色到对角线的最短路径(橙色路径)]
[
而是从“绿色到红色周围路径上的任何点”。
当前伪代码;
take 2 sets of diagonals nearest to Green/start
find the shortest path that connects those diagonals while going through Green
(backtracking through the path is free)
draw a line starting from the target point, in-between the 2 connected diagonals,
set those cells to value infinite to force going around them (and thus around the target)
find the shortest path connecting the now-seperated diagonals
不幸的是,这个伪代码已经包含了一些边缘情况,其中“墙”阻挡了最有效的路径。
如果相关,这将用 javascript 编写。
编辑,作为一种边缘情况,它可以在包围之前使目标螺旋,虽然非常罕见
编辑2; “包围”是指将目标与场的其余部分断开,无论包围的区域有多大,或者即使它包括起点(例如,所有边都是0)
这是另一个具有(可能)最佳路径的较大字段,以及文本形式的 2 个字段:
https://i.imgur.com/yMA14sS.png
https://pastebin.com/raw/YD0AG6YD
【问题讨论】:
-
有趣的一个。我能想到的一种方法是将其分为两个不同的问题:找到包含目标且成本最低的闭环。湾。从源头运行 BFS,直到找到在 a 中找到的闭环的一个单元格。第一个问题(a)当然是更难的一个。
-
请您编辑问题以将您的测试用例的数据之一包含为代码(即二维数组)以便可以复制/粘贴?
-
栅栏有两个侧面。围绕起始节点的栅栏是否也被视为“围绕”目标节点?如果不是,您能否澄清“环绕”的含义,即对于从目标节点断开连接的任何给定路径,哪些被认为是“环绕”目标,哪些不是?
标签: algorithm breadth-first-search pseudocode shortest-path dijkstra