问题
在n×m的二维方格图s中从beg点移动到end点。
解法
广度优先搜索是优先搜索二维方格图s中每个节点的相邻节点,与之相对的深度优先搜索则会沿着节点的一个相邻节点试图走到最远。
例如在下面这个5×4二维方格s中从beg=[1,0]移动到end=[4,3]。初始时将起点beg加入待搜索节点的队列queue中,之后每次从queue中取出头节点e,访问e四周从未被访问的邻节点,并将邻节点加入queue中。将每个节点加入queue之前将其染为红色,避免重复访问。
(1) 初始时将beg=[1,0]染红并加入queue;
(2) 从queue中取出头节点[1,0],因[1,0]=end,将其四周未被染红的节点[0,0],[1,1],[2,0]染红并加入queue,图中queue的左边为头部,右边为尾部,新访问的节点插入队列尾部,每次从队列中取出头节点e:
(3) 从queue中取出头节点[0,0],因[0,0]=end,将其四周未被染红的节点[0,1]染红并加入queue;
(4) 从queue中取出头节点[1,3],因[1,3]=end,其四周的节点都已经被染红,因此不加入任何新节点;
(5) 从queue中取出头节点[4,3],因[4,3]=end,算法结束;
本章的图搜索中,一个节点通常只需要搜索一次,常用染色来标记一个节点是否被搜索过,染红后就不会再放入待搜索队列queue中。用类似“父节点”指针来记录搜索时遇到节点的上一个节点,搜索完成时通过“父节点”逆向的找到一条从end回到beg的路径。
该算法的时间复杂度为O(n×m)。
源码
BreadthFirstSearch.h
BreadthFirstSearch.cpp
测试
BreadthFirstSearchTest.cpp