该算法使用什么数据结构?
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,并捕获所有属于最短路径之一的单元格。
我有一个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,并捕获所有属于最短路径之一的单元格。