BreadthFirstSearch 广度优先搜索

问题

n×mn \times m的二维方格图ss中从begbeg点移动到endend点。

解法

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

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

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

(2)(2)queuequeue中取出头节点[1,0][1,0],因[1,0]end[1,0] \ne end,将其四周未被染红的节点[0,0],[1,1],[2,0][0,0], [1,1], [2,0]染红并加入queuequeue,图中queuequeue的左边为头部,右边为尾部,新访问的节点插入队列尾部,每次从队列中取出头节点ee

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

\cdots

(4)(4)queuequeue中取出头节点[1,3][1,3],因[1,3]end[1,3] \ne end,其四周的节点都已经被染红,因此不加入任何新节点;

\cdots

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

本章的图搜索中,一个节点通常只需要搜索一次,常用染色来标记一个节点是否被搜索过,染红后就不会再放入待搜索队列queuequeue中。用类似“父节点”指针来记录搜索时遇到节点的上一个节点,搜索完成时通过“父节点”逆向的找到一条从endend回到begbeg的路径。

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

源码

BreadthFirstSearch.h

BreadthFirstSearch.cpp

测试

BreadthFirstSearchTest.cpp

Last updated