寻找一系列点之间的路径

时间:2010-10-04 21:28:12

标签: path-finding

在我的一个简单项目中使用时,我遇到了一些封锁。

我在网格中有一系列点,“墙”和“开放空间”。网格外的空间被认为是墙壁。我在这个网格中有一个任意数量的点是打开的,如果我在网格中使一个特定的块从开放空间变为墙壁,我必须确定连接的是否会改变。

这样做的有效方法是什么?

Example http://img718.imageshack.us/img718/9044/gridl.jpg

示例:如果绿色方块是墙或开放空间,确定红色方块之间路径的存在/不存在是否会改变。 (PS:我真诚地为我可怕的网格道歉)

现在,我假设某种细胞自动机是最好的,但我不确定。我之前看过寻路,但从未真正看到任何陷入此类问题的东西。

请注意:我不在乎路径有多长,(我知道它们的最大长度)它们必须存在。因此,没有必要找到点之间的最佳路径。

哦,虽然没关系,但我用Java编写这个项目,但任何语言(或伪代码)或算法的英文描述都足够了。 (我知道大多数Curly Bracket语言,有限的Haskell和LISP,他们都会这样做。)

1 个答案:

答案 0 :(得分:1)

这可能不是最佳解决方案,但解决方案如下:

  • 首先填充网格,直到连接的所有点都被分配相同的数字(通过连接我的意思是相邻或相同的数字'岛')。有很多方法可以做到这一点,其中没有一个方法需要太复杂。只需从第一个节点到最后一个节点穿过网格并填充它(如果尚未填充)就可以选择。
  • 如果放入将岛屿分成两部分的墙,则只能打破与相同数字相邻或相同的节点之间的路径。因此,当您添加墙时,请检查是否是这种情况。您可以使用A *合理有效地检查这一点:在与新墙相邻的所有4个节点中,检查它们是否具有相同的数字,它们仍然可以相互连接。
  • 如果墙没有造成分裂:没有路径被破坏,一切都是一样的。
  • 如果墙确实导致分裂:再次泛滥填充网格,并再次检查两个节点是否相邻或相同的数字(如果您检查的块始终打开,它将始终相邻)

以这种方式检查所有节点是相当有效的(我认为检查n * n / 2-n / 2路径将花费O(n ^ 2)),但如果只是必要的话,添加新墙可能会更有效率岛屿是在没有洪水填充的情况下创建的,但这可能更难以实施。