Breadth First Search - 广度优先搜索


问题

m \times n 的二维方格图 s 中从 beg 点移动到 end 点。

解法

广度优先搜索是优先搜索二维方格图 s 中每个节点的相邻节点,与之相对的深度优先搜索则会沿着节点的一个相邻节点试图走到最远。

例如在下面这个 4 \times 5 二维方格 s 中从 beg = [0,1] 移动到 end = [3,4] 。初始时将起点 beg 加入等待搜索的队列 queue 中,之后每次从 queue 中取出头节点 e ,访问 e 四周从未被访问的邻节点,并将邻节点加入 queue 中。将每个节点加入 queue 之前将其染为红色,避免重复访问。

BreadthFirstSearch1.svg

(1) 初始时将 beg = [0,1] 染红并加入 queue

BreadthFirstSearch2.svg

(2) queue 中取出头节点 [0,1] ,因 [0,1] \neq end ,将其四周未被染红的节点 [0,0] [1,1] [0,2] 染红并加入 queue

BreadthFirstSearch3.svg

(3) queue 中取出头节点 [0,0] ,因 [0,0] \neq end ,将其四周未被染红的节点 [1,0] 染红并加入 queue

BreadthFirstSearch4.svg

BreadthFirstSearch5.svg

BreadthFirstSearch6.svg

BreadthFirstSearch7.svg

BreadthFirstSearch8.svg

BreadthFirstSearch9.svg

BreadthFirstSearch10.svg

BreadthFirstSearch11.svg

BreadthFirstSearch12.svg

(4) queue 中取出头节点 [3,1] ,因 [3,1] \neq end ,其四周的节点都已经被染红,因此不做任何操作;

BreadthFirstSearch13.svg

BreadthFirstSearch14.svg

BreadthFirstSearch15.svg

BreadthFirstSearch16.svg

BreadthFirstSearch17.svg

BreadthFirstSearch18.svg

BreadthFirstSearch19.svg

BreadthFirstSearch20.svg

BreadthFirstSearch21.svg

(5) queue 中取出头节点 [3,4] ,因 [3,4] = end ,算法结束;

上列图中的队列 queue 中,左边为头部,右边为尾部,新访问的节点插入队列尾部,每次从队列中取出头节点 e 。如果需要额外的获取从 beg 点到 end 点的完整路径,需要在遍历时标记每个节点的上一个点,即“父节点”,最终可以从 end 通过父节点指针逆向的找到一条回到 beg 点的路径。

该算法下时间复杂度为 O(m \times n)


源码

import, lang:”c_cpp”

测试

import, lang:”c_cpp”