广度优先搜索(BFS)
宽度优先搜索(BFS,Breadth-First Search)也是搜索的手段之一。宽度优先搜索是先搜索距离初始状态近的状态。也就是说,它是按照开始状态→只需1次转移就可以到达的所有状态→只需2次转移就可以到达的所有状态→……这样的顺序进行搜索
宽度优先搜索利用了队列进行计算,队列(Queue)支持push和pop两个操作,数据元素先进先出。其头文件为:#include <queue>
例题:迷宫的最短路径
题目描述
给定一个大小为 N×M 的迷宫。迷宫由通道和墙壁组成,每一步可以向邻接的上下左右四格的通道移动。请求出从起点到终点所需的最小步数。请注意,本题假定从起点一定可以移动到终点。
限制条件
N, M ≤ 100
样例输入
N=10, M=10(迷宫如下图所示。’#’,’.’,‘S’,'G’分别表示墙壁、通道、起点和终点)
#S######.#
......#..#
.#.##.##.#
.#........
##.##.####
....#....#
.#######.#
....#.....
.####.###.
....#...G#
样例输出
22
题目分析
宽度优先搜索按照距开始状态由近及远的顺序进行搜索,因此可以很容易地用来求最短路径、最少操作之类问题的答案。这个问题中,状态仅仅是目前所在位置的坐标,因此可以构造成pair
或者编码成int
来表达状态。
宽度优先搜索中,只要将已经访问过的状态用标记管理起来,就可以很好地做到由近及远的搜索。这个问题中,由于要求最短距离,不妨用d[N][M]
数组把最短距离保存起来。初始时用充分大的常数INF
来初始化它,这样尚未到达的位置就是INF
,也就同时起到了标记的作用。
虽然到达终点时就会停止搜索,可如果继续下去直到队列为空的话,就可以计算出到各个位置的最短距离。此外,如果搜索到最后,d依然为INF的话,便可得知这个位置就是无法从起点到达的位置。
因为要向4个不同方向移动,用dx[4]
和dy[4]
两个数组来表示四个方向向量。这样通过一个循环就可以实现四方向移动的遍历。
代码
#include