问题
在n×m的二维方格图s中用双向广度搜索从beg点移动到end点。
解法
双向广度优先搜索是在广度优先搜索基础上的一个变种,搜索速度更快。该算法从beg和end两个点开始,同时进行广度优先搜索,两边的点在某一处相遇,即可得到一条从beg到end的路径。
初始时将beg和end分别加入两个队列bq和eq中。每次分别从bq和eq队列中取出节点x和y进行访问,在节点加入bq之前将其染成红色,加入eq之前其染成蓝色。若x取出后发现已被染成蓝色,说明x被eq访问过,或y取出后发现其已被染成红色,说明y被bq访问过。说明两个队列在此处相遇,算法结束。
在5×4的二维方格s中,从beg=[1,0]移动到end=[4,3]的过程如下:
(1) 初始时,将beg=[1,0]染红并加入bq中,将end=[4,3]染蓝并加入eq;
(2) 从bq中取出头节点[1,0],将其四周未被染色的邻节点[0,0],[1,1],[2,0]染红并加入bq中。从eq中取出头节点[4,3],将其四周未被染色的邻节点[4,2],[3,3]染蓝并加入eq中;
(3) 从bq中取出头节点[0,0],将其四周未被染色的邻节点[0,1]染红并加入bq中。从eq中取出头节点[4,2],将其四周未被染色的邻节点[4,1],[3,2]染蓝并加入eq中;
(4) 从bq中取出头节点[2,1],其邻节点[2,2],[1,3]已经被染蓝(已经被eq访问过)。因此[2,2],[1,3]为bq和eq相遇的位置,算法结束;
对于二维方格s,广度优先搜索从beg点遍历到end点的过程一般是从beg向四周发散开,一直到达end点。而双向广度优先搜索则是从beg和end两个点分别发散开,在中间相遇。
双向广度搜索的时间复杂度与广度优先搜索一样,也是O(n×m)。
源码
BidirectionalBreadthSearch.h
BidirectionalBreadthSearch.cpp
测试
BidirectionalBreadthSearchTest.cpp