我在编程时遇到了一些麻烦。
有一个随机生成的二维数组,大约为50x50,每个单元格的值为1~99。
从一个随机位置“Green”开始,目标是用最少的移动次数将目标“Red”包围起来。
移动到相邻单元格需要1~99次操作,具体取决于它的值。
以下是具有较低值的小数组示例:
[]
目前我想到的最好的方法是,基于目标点的对角线生成4组检查点,然后使用大量的Dijkstra算法找到经过所有检查点和起始点的路径。
我遇到的一个问题是,这很快就变成了极其多的路径。
从任何起点“NorthWest-1 to NW-20”到“NE-1 to NE-20”的任何结束点,有400种可能性。加上第三个和第四个对角线后,变成了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)。
这里有另一个更大的场地,可能具有最优路径,并且还有两个文本形式的场地:
https://i.imgur.com/yMA14sS.png
https://pastebin.com/raw/YD0AG6YD