【问题标题】:Determining if a point is "trapped" (enclosed) on a grid确定一个点是否在网格上“被困”(封闭)
【发布时间】:2012-08-01 22:42:34
【问题描述】:

我有一个网格(下面的示例),其中包含外墙(标记为 W)、环境块 (E)、开放空间 (o) 和活动点 (A)。目前,该网格存储在 [,] 中,所有数据都与给定点相关联。我试图确定一个活动点是否被封闭(定义为无法到达网格的顶部,因为它被环境块阻挡),但我很难找到解决这个问题的简单方法。我知道我可以实现 A* 并且使用所有示例代码或多或少会很容易,但我认为对于这样一个看似微不足道的操作来说,性能损失真的是必要的或值得的。

W--Top Of Grid--W
W---------------W
W-EEAEE-----EEE-W
WEEEEEEE-EEEEAEEW
WEEEEEEE--EEEEEEW
WEEEEEEEE-AEEEEEW
WWWWWWWWWWWWWWWWW

向下第三行的 A 可以绘制到网格顶部的路径,最后一行的 A 可以,但是向下第四行的 A 不能。我不关心实际路径,我只需要确定对象是否被困。这个项目的最佳解决方案是什么?

不管怎样,如果有帮助的话,它是一个用于回合制网格游戏的 C# 项目。

提前感谢您提供的任何帮助,非常感谢。

【问题讨论】:

  • 如果网格接近那么小,“性能损失”将几乎为零,所以继续实施 A*。你也可以做一个简单的广度优先搜索,但 A* 并不比 BFS 复杂。
  • 网格明显更大(可高达 100x100 个节点),显示的网格很小以便于查看。这仍然适用于那个规模吗?
  • 我仍然会说这可能不会成为问题,除非你也有很多“活跃点”。只需将启发式设置为从顶部开始的高度。完成后,分析您的应用程序,并查看寻路是否是一个瓶颈 - 如果是这样,也许我们可以更快地想出一些东西,但在那之前,您不值得花时间去优化它。
  • 非常感谢!我试试看!

标签: arrays path-finding


【解决方案1】:

我认为顶部网格的填充将解决所有问题。从顶部泛滥,然后检查哪个“A”被泛滥:)

算法保证在整个过程中只访问每个节点一次,最坏的情况下不会更快。而且用任何语言都非常容易实现。

这是来自Wikipedia的算法:

 Flood-fill (node, target-color, replacement-color):
 1. If the color of node is not equal to target-color, return.
 2. Set the color of node to replacement-color.
 3. Perform Flood-fill (one step to the west of node, target-color, replacement-color).
    Perform Flood-fill (one step to the east of node, target-color, replacement-color).
    Perform Flood-fill (one step to the north of node, target-color, replacement-color).
    Perform Flood-fill (one step to the south of node, target-color, replacement-color).
 4. Return.

...它看起来像:(来自维基)

简而言之:

  1. 来自顶部网格的洪水,“W”和“E”阻挡洪水(就像图片中的黑色单元格)
  2. 洪水过后,检查有多少包含“A”的地方被洪水淹没。

【讨论】:

  • 这会比 BFS 更糟糕,除非有很多“活动节点”。对于大型网格,A* 肯定更可取。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-29
  • 2010-09-30
  • 1970-01-01
  • 2011-09-27
  • 1970-01-01
相关资源
最近更新 更多