该算法使用什么数据结构?

What data structure to use for this algorithm?

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

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

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

所以,你有一个有墙、起点和终点的矩阵,你应该 return 从起点到终点的最短路径。这是 breadth-first 搜索算法的经典任务。这也可以用 A* 和曼哈顿距离启发式

来解决

UPD.

阅读评论是正确的,这与寻找最短路径不同,但是很容易改变一点 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,并捕获所有属于最短路径之一的单元格。