问题描述
我很难找到正确的编码方法。
取一个随机生成的2d数组,大约50x50,每个像元的值为1〜99。
从一个随机位置“绿色”开始,目标是以最少的操作量包围目标“红色”。
移至相邻的单元格需要1〜99个动作,具体取决于其值。
低值的小数组示例:
[
目前我最好的主意是,根据目标的对角线生成4组检查点,然后使用大量的Dijkstra查找通过所有检查点的路径以及起点。
我遇到的一个问题是,这很快就会变成大量的路径。
从“ NorthWest-1到NW-20”的任何起点到“ NE-1到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编写。
编辑,作为一种极端情况,它可以在包围之前使目标旋转,尽管极为罕见
https://wiki.termux.com/wiki/Differences_from_Linux
Edit2; “环绕”是指将目标与视野的其余部分断开连接,而不管包围区域有多大,或者即使它包括起点(例如,所有边都为0)
这是另一个具有(可能)最佳路径的较大字段,并且以文本形式包含2个字段:
https://i.imgur.com/yMA14sS.png
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)