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

时间:2016-01-18 22:40:08

标签: algorithm matrix graph breadth-first-search

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

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

  • 我应该使用某种数据结构来执行此任务吗?
  • 而且,算法何时必须停止?

1 个答案:

答案 0 :(得分:0)

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

所以,你有一个带有墙,起点和终点的矩阵,你应该从开始到结束点返回最短路径。这是广度优先搜索算法的经典任务。这也可以通过具有曼哈顿距离启发式的A *来解决

UPD。

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

  • 对于每个单元格,我们应该从起始点为该单元格存储最小距离值。
  • 4位,表示此单元格是否可以从具有该距离的4个方向之一到达。通常我们存储协调(或方向),告诉我们来自哪个单元格。

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

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

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

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

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