一尘不染

找到彼此最远的两个点的算法

algorithm

我正在寻找要在我制作的赛车游戏中使用的算法。地图/级别/航迹是随机生成的,因此我需要找到两个位置,即开始位置和目标位置,以充分利用大部分地图。

  • 该算法是在二维空间内工作
  • 从每个点开始,只能在四个方向上遍历下一个点。上下左右
  • 点只能被阻塞或未被阻塞,只能遍历非阻塞点

关于距离的计算,由于缺少更好的词,它不应该是“鸟路”。如果A和B之间存在壁(或其他阻挡区域),则它们之间的路径应更长。

不确定从哪里开始,非常欢迎提出评论,建议的解决方案是伪代码的首选。

编辑: 对。浏览完gs的代码后,)我又给了它一个镜头。这次我不是用python,而是用C
++编写的。但是,即使在阅读了Dijkstras算法floodfill和Hosam
Alys解决方案之后,我也没有发现任何关键的差异。我的代码仍然可以运行,但运行速度不如您看起来快。完整信息来自于粘贴。唯一有趣的行(我想)是第78-118行的Dijkstra变体本身。

但是速度不是这里的主要问题。如果有人足够友善地指出算法上的差异,我将非常感谢您的帮助。

  • 在Hosam Alys算法中,他从边界而不是每个节点扫描的唯一区别是?
  • 在Dijkstras中,您可以跟踪并覆盖步行的距离,但不能在洪水填埋场中,仅此而已?

阅读 367

收藏
2020-07-28

共1个答案

一尘不染

假设地图是矩形,则可以在所有边界点上循环,然后开始填充以查找距起点最远的点:

bestSolution = { start: (0,0), end: (0,0), distance: 0 };
for each point p on the border
    flood-fill all points in the map to find the most distant point
    if newDistance > bestSolution.distance
        bestSolution = { p, distantP, newDistance }
    end if
end loop

我想这会在O(n^2)。如果我没有记错的话,它是(L+W) * 2 * (L*W) * 4,其中地图L的长度和W宽度是,(L+W) * 2代表周界上边界点(L*W)的数量,是点的数量,并且4是洪水填充将最大访问点的假设4次(从所有方向)。由于n等于点数,因此等于(L + W) * 8 * n,应优于O(n2)。(如果地图为正方形,则顺序为O(16n1.5)。)

更新:
根据评论,由于地图更像是一个迷宫(比起我最初想的那样,没有一个简单的障碍),您可以在上面做同样的逻辑,但是要检查地图中的所有点(而不是地图上的点)仅边框)。这应该是O(4n2的量级,)仍然比FW和Dijkstra的都好。

注意:
因为所有顶点仅通过4个边界直接连接,所以洪水填充更适合此问题。地图的广度优先遍历可以相对快速(仅O(n))产生结果。我假设可以从洪水填充中的每个4个邻居中检查每个点,因此上述公式中的系数。

PS任何意见或更正,欢迎。

2020-07-28