如何在随机生成的迷宫中找到最远的两个点?

How to find the farthest two points in a randomly generated maze?

注意:我已经有了随机生成迷宫的方法,可以在这里找到:

https://en.wikipedia.org/wiki/Loop-erased_random_walk

我正在寻找一种算法来找到已完成的随机生成的迷宫中最远的两个单元格。我不是说最远,因为如果你要从一个单元格到另一个单元格画一条直线,那么这条线的长度就是最长的。这总是会导致以下两种情况之一:

  1. 选择了左上角的单元格和右下角的单元格。

  2. 选择了右上角的单元格和左下角的单元格。

我打算找到一种算法来找到这两个单元格,如果你一次(向上、向下、向左或向右)从第一个单元格移动到第二个单元格,而不是穿过迷宫的墙壁,需要你穿过最多的格子。

Example of Randomly Generated Maze Using the Algorithm Found in the Link Above

提前致谢。

有一种叫做Dijkstra's algorithm的算法,最初是为了找到两点之间的最短路线而设计的。这听起来好像和你要找的相反,但是如果你学习了算法,你可以使用条件得到相反的结果:找到最长的路线。

这是解释该算法的维基百科: https://en.wikipedia.org/wiki/Dijkstra%27s_algorithm

这是一段解释该算法的视频: https://www.youtube.com/watch?reload=9&v=pVfj6mxhdMw

正如@Luis 所指出的,您绝对应该查看 Dijkstra's algorithm。但是,您需要添加一堆额外的约束。不重新访问单元格(否则对于 3 块迷宫本身,您可以拥有最长的无限路径)。

您使用的算法生成的迷宫始终是一棵树。一棵树中最长的路径称为它的直径,如果你 google "diameter of a tree",你会找到有效的算法。

我建议的迷宫是:

  1. 选择迷宫中的任何死胡同。将此单元格命名为 A.
  2. 找到距 A 最远的单元格。如果出现平局,则使用最远的单元格。为此使用广度优先搜索并记住找到的最后一个单元格。称它为B.
  3. 用同样的方法找到B最远的调用。称之为C.

B-C 是你的树的直径。