我有Matrix [N][M]
。我用-1
代表的障碍和0
代表的移动空间填充了这个矩阵。我还有一个由-2
代表的人A.此人必须检查,向下,向右和向左检查是否有障碍物。如果没有,则按1
递增,将其放在当前单元格中。完成检查后,请转到该单元的邻居,并对其邻居进行相同的检查。
显然,算法从人A所在的位置开始,并检查我写的上述内容。我的工作是找到A人和B人可以相遇的特定小区,但路径必须尽可能短。我想算法应该记住哪些细胞增加了。
答案 0 :(得分:0)
重新制定你的问题。你有一个迷宫,其中Matrix [N] [M]的每个单元格表示-1(如果这是一个墙)或0表示如果这是一个空格。你也有人的位置P1 =(X1,Y1)和P2 =(X2,Y2)。您不需要将人员位置保存为矩阵中的-2,但您可以。任务是找到所有可能的单元格,其中第一个人可以遇到具有最小摘要路径的第二人。这与查找从P1到P2创建最短路径的单元格完全相同。第二个人可以留在他们的起始单元中,并且只移动第一个人。
所以,你有一个带有墙,起点和终点的矩阵,你应该从开始到结束点返回最短路径。这是广度优先搜索算法的经典任务。这也可以通过具有曼哈顿距离启发式的A *来解决
UPD。
ead注释是正确的,与查找最短路径不同,但很容易更改一点bfs,以便我们可以找到所有可以属于某些最短路径的单元格。我们不仅应该跟踪bfs中某个单元格的一个前任:
例如我们有矩阵和点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,并捕获所有属于最短路径的单元格。