一、简介
- 宽度优先搜索BFS,它的基本思想是仿树的层次遍历,不过通常都会借助队列实现。
1、初始状态是图中所有顶点未被访问,从图中某个顶点V1出发,访问这个顶点;
2、然后依次访问V1的所有未被访问过的邻接点V2,V3,按照这些顶点被访问的先后顺序一次访问它们的邻接点,直到图中所有和V1有路径相通的顶点全部都被访问过一遍;
3、若还有顶点未被访问,则从中选一个作为起始点,重复上述过程,直到图中所有顶点都被访问过为止。
4、遍历顺序:V1->V2->V3->V4->V5->V6->V7->V8
- BFS是一个分层的搜索过程,每向前走一步可能访问一批顶点,不像DFS那样有回溯的可能;
- 所以BFS不是一个递归的过程,它的算法也不是递归的。
二、实例
- 在这里我们依然用上篇文章的迷宫问题来作为例子,不同的是这次用BFS实现;
- 问题一分析
从起始点开始,将起始点存入队列中,走过起始点后将它出队,将下一步可能出现的情况入队,然后走过的顶点出队,直到队列为空,若此时还没到达终点,则不可能走出迷宫;
- 代码实现
#include <iostream>
#include <cstring>
#include <queue>
using namespace std;
int map[12][12], mark[12][12], dir[4][2] = {
{
1, 0 }, {
0, 1 }, {
-1, 0 }, {
0, -1 } };
bool BFS(int x, int y, int n, int m)
{
mark[x][y] = 1;
queue<int> q_x, q_y;
q_x.push(x);
q_y.push(y);
while (q_x.size())
{
int x = q_x.front();
int y = q_y.front