问题描述:一个二维迷宫地图,0表示不可通行,1表示可以通行,2表示可以通行且为必经点,用集合S表示,3表示起点,用点A表示,4表示终点,用点B表示。求从A到B的最短路径。
问题分析:
(一)首先从点A出发,在S中找出距离点A最近的必经点s1,再从s1出发找出距离点s1最近的必经点s2,以此类推,最终找到sn。计算sn到终点B的距离,将这些距离循环叠加,就是整个的最短路径。(尚需要理论证明)
证明:当n=3时显然成立,若AB<AC,那么AB+BC<AC+CB,成立。(1)
当n= 4时,构成四边形,ABCD,假设先走B点,那么BCD中距离B点最近的点M,以及剩下的一点N,肯定可以保证BM,MN之后最短。此点可以由(1)可知。同理先走C点,或者D点同样可以保证剩下MN的最短。在BCD三点之间的最短距离肯定相等,固有
Dis(B) = Dis(C) = Dis(D)。那么ABCD之间的距离可以转化为:
AB+Dis(B) ,AC+Dis(C) ,AD+Dis(D) 那么可以得出结论,先走距离A最短的点,然后根据此点一次寻找距离是最短距离。(2)
当n=K+1是,构成k+1边行(可能非凸多边形)。可以保证K个点的最短路径一致。此点可以有(1)(2)联合推导推广得出。
那么A到剩下K个点的最短距离也是从距离A最短的距离依次延伸取得。
法一:a、求A到某必经点S’之间的最短距离。可以通过深度优先方法取得。
b、比较每个必经点S’与A之间的最短距离,找出最最短的距离,作为第一个点。
c、根据第一个点S1,按照a、b步骤循环计算,最终找出Sn个点。
d、计算Sn到点B的距离
e、计算这些距离之和。
复杂度很高。
法二:a、求A到第一个必经点S’之间的最短距离。用广度优先方法。以广度优先搜索得到的最先找到的点,肯定是距离A最近的点。(尚需理论证明)
b、以点S1作为出发点,用a步骤循环计算,最终找出Sn个点。
c、计算Sn到点B的距离
d、计算这些距离之和。
说明:根据广度优先搜索的原则,每一次向下搜索,处于同一层的距离肯定一样,那么广度优先搜索找到的第一个必经点必定距离起始点最近,即可终止搜索。根据每个点的被访问属性可以对广度优先搜索进行剪枝。
复杂度相对较低。