【问题标题】:What data structure to use for this algorithm?该算法使用什么数据结构?
【发布时间】:2016-01-18 22:40:07
【问题描述】:

我有一个Matrix [N][M]。我用-1 表示的障碍物和0 表示的移动空间填充了这个矩阵。我还有一个由-2 代表的人A。这个人要上下左右检查,看看有没有障碍物。如果没有,则增加1,将其放在当前单元格中。完成检查后,转到该单元格的邻居并对其邻居进行相同的检查。

显然,算法从 A 所在的位置开始,并检查我写的上述内容。我的工作是找到一个特定的单元格,让 A 和 B 可以相遇,但路径必须尽可能短。我猜算法应该记住哪些单元格增加了。

  • 我应该为这项任务使用某种数据结构吗?
  • 而且,算法什么时候必须停止?

【问题讨论】:

  • 您可以将矩阵视为一个图形。你的算法是 BFS(如果我理解正确的话)。只需检查您是否已经增加了相邻单元格的值。如果不是 - 将此单元标记为递增并将此邻居放入队列。
  • 这个算法的目的是什么?您想找到此人可以到达的所有单元格吗?或者到达某个特定的其他单元格?
  • 找到 A 和 B 可以相遇的特定单元格,但路径必须尽可能短。
  • 那么有B人吗?哪条路径必须是最短的? A人的路径,B人的路径还是B人和A人的路径之和?
  • 你看过bfs:en.wikipedia.org/wiki/Breadth-first_search吗?为什么您认为这种方法对您不起作用?

标签: algorithm matrix graph breadth-first-search


【解决方案1】:

让我们重新表述您的问题。您有一个迷宫,其中 Matrix [N][M] 的每个单元格表示 -1(如果这是墙)或 0(如果这是空间)。此外,您还有人 P1=(X1,Y1) 和 P2=(X2,Y2) 的位置。您不需要在矩阵中将人员位置保存为 -2,但可以。任务是找到所有可能的单元格,第一个人可以在其中遇到第二个人,并且它们的摘要路径最小。这与找到创建从 P1 到 P2 的最短路径的单元格完全相同。第二人称可以留在他们的起始单元中,并且只能移动第一人称。

因此,您有一个包含墙壁、起点和终点的矩阵,您应该返回从起点到终点的最短路径。这是广度优先搜索算法的经典任务。这也可以用曼哈顿距离启发式的 A* 来解决

更新。

ead 注释是正确的,这与寻找最短路径不一样,但是很容易改变一点 bfs 以便我们可以找到所有可以属于某些最短路径的单元格。我们不仅应该跟踪 bfs 中某个单元的一个前身:

  • 对于每个单元格,我们应该存储该单元格与起点的最小距离值。
  • 4 位,表示此单元格是否可以从 4 个方向之一以该距离到达。通常我们会存储坐标(或方向),表明我们来自哪个单元格。

例如我们有矩阵和点​​ P1 和 P2,所以我们这里有 2 条最短路径:

P1 -- 0 -- 0
|     |    |
|     |    |
0  -- 0 -- P2

我们跟踪从我们可以到达这个单元格的方向的集合(可以实现为设置位),让它们称为 UDLR:

P1 -- L(1) -- L(2)     in brackets written shortest distance
|      |      |
|      |      |
U(1)-- LU(2)--LU(3) 

然后我们需要从 P2 到 P1 的第二个 bfs,并捕获所有可以属于最短路径之一的单元格。

【讨论】:

  • valdem 写道:“任务是找到所有可能的单元格,第一个人可以在其中遇到第二个人,而他们的摘要路径最少。” - 我不确定这是正确的任务/问题,这绝对与“返回从头到尾的最短路径”不同,因为可能有多个最短路径。
  • 使用 A* 代替 bfs 并为搜索指明方向是一个非常好的主意!平均而言,对于更大的问题,它可能会更快......
  • 我仍然不相信,你对任务的解释是正确的,但你对问题的解释足够有趣!但是我不明白 UDLR 位的必要性。在您的示例中,有三个最短路径:d(own)r(ight)r、rdr 和 rrd。
猜你喜欢
  • 1970-01-01
  • 2011-12-12
  • 2011-10-24
  • 2014-06-02
  • 1970-01-01
  • 1970-01-01
  • 2017-11-20
  • 1970-01-01
相关资源
最近更新 更多