前面有对dfs的介绍以及实例分析,这次对广度优先算法(bfs)进行介绍以及相关实例,首先总结一下dfs和bfs的区别:
1)广度优先搜索算法(Breadth-First-Search,缩写为 BFS),是一种利用队列实现的搜索算法。简单来说,其搜索过程和 “湖面丢进一块石头激起层层涟漪” 类似。
2)深度优先搜索算法(Depth-First-Search,缩写为 DFS),是一种利用递归实现的搜索算法。简单来说,其搜索过程和 “不撞南墙不回头” 类似。
实例还是迷宫搜救:
问题描述:A处于迷宫的入口处(1,1),B在(p,q)。找从(1,1)到(p,q)的最短路径(步长),如图:
输入描述:
整数n m:分别代表迷宫的行和列;
a[n][m]:用1表示有障碍,0表示无障碍;
start end p q:分别代表起始座标和终点座标;
输出描述:
整数step 最短步长
例如:
输入:
4 4
0 0 0 0
0 1 0 0
0 0 0 1
1 0 0 0
1 1 4 2
输出:
4
代码(c/c++):
#include <iostream>
#include <queue>
using namespace std;
const int MAX_N = 100;
const int MAX_M = 100;
const int INF = 0x3f3f3f3f;
typedef pair<int, int> P;
int maze[MAX_N][MAX_M + 1];
int N, M;
int sx, sy; //起点的位置
int gx, gy; //终点的位置
int d[MAX_N][MAX_M];//储存起点到某一点的距离
int dx[4] = { 1,0,-1,0 }, dy[4] = { 0,1,0,-1 }; //表明每次x和y方向的位移
void bfs()
{
queue<P> que;
for (int i = 1; i <= N; i++)
for (int j = 1; j <= M; j++)
d[i][j] = INF; //初始化所有点的距离为INF
que.push(P(sx, sy));
d[sx][sy] = 0; //从起点出发将距离设为0,并放入队列首端
while(que.size()){
P p = que.front();
que.pop(); //弹出队首元素
int i;
for(i=0;i<4;i++){
int nx = p.first + dx[i];
int ny = p.second + dy[i];
if(nx>=1&&nx<=N&&ny>=1&&ny<=M&&maze[nx][ny]!=1&&d[nx][ny]==INF){
que.push(P(nx, ny));
d[nx][ny] = d[p.first][p.second] + 1;
if(nx==gx && ny==gy)
break;
}
}
if(i!=4)
break;
}
}
int main()
{
cin>>N>>M;
for(int i=1;i<=N;i++){
for(int j=1;j<=M;j++)
cin>>maze[i][j];
}
cin>>sx>>sy>>gx>>gy;
bfs();
cout<<d[gx][gy]<<endl;
return 0;
}