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