【问题标题】:How to find specific path patterns efficiently?如何有效地找到特定的路径模式?
【发布时间】:2014-10-28 07:01:34
【问题描述】:

寻找一种模式来搜索网格上的特定路径。有简单节点的二维网格,例如:

public class TileNode {
    private final int ID;

    public TileNode leftNeightbour;
    public TileNode topNeightbour;
    public TileNode rightNeightbour;
    public TileNode bottomNeightbour;
    private TileState currentTileGameState;
}

如果其中一个邻居无法通过当前节点,则其状态设置为outOfGame。我尝试使用递归 DFS alg 来查找所有路径,但复杂性很糟糕。我将尝试使用这些搜索路径来削减搜索集合:

红色节点是我们开始和结束的节点,黑色线是应该通过其他节点(邻居)的路径,这些节点可以通过。

我们不考虑除指定路径之外的任何其他路径。当然,这些路径的长度没有限制。

编辑: 我想检查两个节点之间是否存在任何遵循图像路径的路径。这可能很简单。可能存在不止一个。它看起来类似于那些路径example

【问题讨论】:

  • 换句话说。您必须在网格上找到具有给定起点终点的 n 路径。路径可能不会相交,并且可能没有解决方案,因为路径可能会相互锁定。对吗?
  • 感谢您的澄清。但是你一次只看一条路吗?或者你需要找到几条不能跨越的路径?
  • 我寻找一个存在。如果存在与其中一种模式匹配的模式,我想将其存储以备将来使用。

标签: java android algorithm oop path-finding


【解决方案1】:

我认为您的数据结构不适合找到您想要的路径,因为您不是在寻找任何路径,而是在寻找某种形状的路径。

使用真实的数据网格可能会更好,即二维数组,而不是带有链接的类似图形的结构。至少你应该知道你的水平和垂直位置(x,y)。

然后您可以这样处理您的问题:查找垂直路径,即中间段垂直的路径。当两个图块的 y 坐标(向上)相同时,没有垂直路径。然后找到水平路径。只有两段或三段的路径可以被认为是三段路径的退化情况。

所以如果瓦片的y位置不同:

  • 找到从开始和结束图块 [L1, R1] 和 [L2, R2] 可到达的最左侧和最右侧位置。
  • 当 L1 和 L2 都超出网格的左边界或 R1 和 R2 都超出了网格的右边界时,您就有了路径。
  • 求两个范围的交集,[L, R] = [L1, R1] ∩ [L2, R2]。如果该交叉点为空,则没有(垂直)路径。
  • 对于 [L, R] 中的所有 x 位置,测试是否存在从 (x, y1) 到 (x, y2) 的可能直线。

如果没有垂直路径,则对水平路径执行相同操作。

【讨论】:

  • 你怎么理解“:查找垂直路径,即中间段垂直的路径。”?整个棋盘由点组成,尽管您说要找到使用 2D 数组的路径并不是那么简单。
  • @Kuba:但是这些点是按网格排列的,不是吗?因此,了解网格有助于找到一条好的路径。或者我在这里错过了什么?想想国际象棋。如果车(城堡)在 A1 上,可能的移动是从 A2 到 A8 和从 B1 到 H1。你的数据结构不仅应该知道邻居,还应该知道瓦片的位置。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多