理解:
宽度优先搜索算法(又称广度优先搜索)是最简便的图的搜索算法之一,是很多重要的图的算法的原型。Dijkstra单源最短路径算法和Prim最小生成树算法都采用了和宽度优先搜索类似的思想。
对比DFS:
DFS也一定可以搜到,但不一定是最短路
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
const int N=110;
int g[N][N]; //存储地图
int d[N][N]; //标记搜索到的点的距离
int n,m; //地图的长宽
struct elem{
int x;
int y;
};
struct elem q[N*N]; //队列用于BFS操作
int bfs()
{
memset(d,-1,sizeof d); //初始化d
int hh = 0,tt = 0;
d[0][0] = 0; //左上角第一个点开始搜索
q[hh] = {0,0}; //将第一个点入队
int dx[4] = {-1,0,1,0}; //方向盘用于对个方向进行尝试
int dy[4] = {0,-1,0,1};
while(hh <= tt) //队列不为空
{
struct elem j = q[hh++]; //获取队头元素 然后将其出队
for(int i = 0;i < 4;i ++)
{
int x = j.x + dx[i];
int y = j.y + dy[i];
if(x >= 0 && y>=0 && x<n && y<m && g[x][y] == 0 && d[x][y] == -1) //点未出界 该点可走 且未走过
{
d[x][y] = d[j.x][j.y] + 1;
q[++tt] = {x,y};
}
}
}
return d[n-1][m-1];
}
int main()
{
cin >> n >> m;
for(int i = 0;i < n;i ++)
for(int j = 0;j < m;j ++)
cin >> g[i][j];
cout << bfs() << endl;
return 0;
}