Algorithm 在二维数组中寻找最短路径

Algorithm 在二维数组中寻找最短路径,algorithm,path-finding,Algorithm,Path Finding,我正在寻找一种算法,该算法允许我在点“T”和“C”之间找到最短的路径 ############################## #.....T........############### #.......................#.#..# #.#######################.#..# #.....##......##......#....### #...####..##..##..##..#..#...# #.........##......##.....#.C.

我正在寻找一种算法,该算法允许我在点“T”和“C”之间找到最短的路径

##############################
#.....T........###############
#.......................#.#..#
#.#######################.#..#
#.....##......##......#....###
#...####..##..##..##..#..#...#
#.........##......##.....#.C.#
##############################
最近有人向我介绍了这类问题。 我在这里发现了一个和这个问题几乎相似的问题,这个问题是用Lee算法解决的,但不能应用到我的案例中

其他一些朋友建议我使用递归算法,但我仍然不熟悉


你能不能给我一个大概的想法,如何解决这个问题,应该使用什么样的算法?

这个想法是一步完成你从T到的所有点,并对这些点进行跟踪;然后分两步到达所有点,依此类推,直到到达C

标记您访问的所有点,并保留一个以K步实现的点的列表。扫描列表,标记所有未访问的邻居,并更新列表以形成“K+1”列表


在给定的示例中,通过47个步骤达到C,四个点无法达到,一个点在C之后达到。

您试图解决的问题称为


推荐的算法之一是

在A*中,单元格的值是两部分的总和——到达该单元格的实际成本和从该单元格到达目的地的预期成本(称为“启发式”)。对于启发式,我们可以简单地使用一个叫做的东西,即x的差加上y的差

然后,我们的想法是保留一个可能的候选点(我们可以保留一个单元格的坐标,以及到达该单元格的路径,以代表一个候选点),这样我们就可以在每一步中选择一个我们希望在最短路径中的候选点。然后我们从这个优先级队列中的源单元格开始,然后移除最小值,检查它是否是目的地,然后将其所有未探测的邻居添加回优先级队列,并以这种方式继续,直到到达目的地

为了跟踪未探测的邻居,我们可以保持相同大小的布尔矩阵,初始化为所有假值,并在探测到每个值时将其设置为真(然后很明显地检查相应的单元格是否设置为真,以检查单元格是否被探测)


另一个推荐的方法是,但这实际上是针对加权图(其中两个步骤可能有不同的成本),尽管它也适用于此。实际上我们更喜欢,这可以看作是Dijkstra算法的一个特例

在BFS中,我们保持一个由所有可能的候选元素组成的队列,然后从队列中取出一个元素,检查它是否是目的地,并将其所有未探测的邻居排队,然后继续这样做,直到到达目的地


Dijkstra的算法/BFS将是更简单的方法,但也需要更长的时间才能找到最短路径

但是,你必须小心选择一个*虽然,因为选择一个不是的启发式(意味着它可能高估到达目的地的成本)是有问题的-但是上面提到的曼哈顿距离没有这个问题


(维基百科提供的动画)

你要找的术语是路径查找。若你们只允许左/右/上/下移动,那个么简单地使用ye我只允许左/右/上/下移动,我会在那个里看一看谢谢你们,guysA*启发式的“当前点和目标之间的曼哈顿距离”是一种常见的方法。
##############################
#54321T12345678###############
#65432123456789012345678#5#..#
#7#######################4#..#
#89012##901234##123456#1234###
#901####89##45##01##67#12#567#
#012345678##567890##78901#6C.#
##############################