想要的算法:将港口放置在六边形地图中以确保洲际旅行

问题描述

我正在制作一个使用六边形瓷砖来表示地图的游戏;瓷砖或六边形,每个都包含以列表形式指向其所有邻居的指针。地图可能如下所示:

enter image description here

大片的绿色区域是“大陆”,而小的黄色区域是“岛屿”,其余是普通水体,注意小块水可能被困在大陆内部。

大陆和岛屿始终是相邻的,从不接壤。玩家将在任何时候占据一个六角形。基本移动会将玩家从一个六角形移动到另一个六角形,前提是起点和目的地相邻,并且该移动不会将玩家从陆地六角形移动到水六角形。

“海港”是一个即将推出的功能,放置在大陆或岛屿的六角形中,它们允许玩家从港口移动到任何相邻的水六角形,这应该能够在陆地之间移动

问题: 我想在这样的地图中至少放置2个港口,以确保玩家始终可以从大陆到岛屿,反之亦然。

由于以下并发症,这比看起来更难:

  1. 如果将海港放在内陆水域的岸边,它们将毫无用处
  2. 大陆可能将海洋分成多个部分,因此港口可能不会被放置在右岸以发挥作用(在下面的示例中;H1 和 H2 不能完全通过水进行通信,而 H2 和 H3 可以)

figure 2

因此,我欢迎任何关于在这些地图上放置港口的合适算法的清晰描述,任何伪代码都将受到高度赞赏

解决方法

它是普通 BFS 或双向 BFS。

从接触水的六角形开始 BFS - 橙色单元格。如果 BFS 在中间相遇,则在这些陆地区域上放置一个港口。这将有助于避免像港口 H1 这样的情况,因为来自像 H1 这样的单元的 BFS 不会遇到任何其他陆地区域。

enter image description here

注意:在您的帖子中,您不是在寻找要放置的最小港口。同样,BFS 将在那里有所帮助,但它在实现中需要更多处理。请参阅下面的地图。红色是地图上放置的最少港口。

enter image description here