BFS(宽度优先搜索)
宽度优先搜索最大的优势是可以搜索到最短路,然而在空间上要比DFS上大一些。BFS是一层一层向外搜索,先搜索所有距离为1的点,再搜索所有距离为2的点,以此类推,所以搜到的点是逐渐离我们越来越远的,找到的第一个即为最小,前提是图的边的权重都为1。
走迷宫
#include <bits/stdc++.h>
using namespace std;
typedef pair<int, int> PII;
const int N = 110;
int n, m;
int g[N][N], d[N][N]; // g用于读取地图,d兼具判重和计算长度两种功能。
int bfs()
{
queue <PII> q; // 用队列存储每一次走到的点
memset(d, -1, sizeof d); // 初始化,用于后续判重.
d[0][0] = 0; // 原点的距离是0.
q.push({0, 0}); // 以原点开始查找
int dx[4] = {-1, 0, 1, 0}, dy[4] = {0, 1, 0, -1}; // 表示该点向四个方向走的可能的情况。
while (q.size()){
auto t = q.front(); // 每次取出队头的点,进行四个方向的查找
q.pop(); // 将队列中的该点删除.
for (int i = 0; i < 4; i ++ ){
int x = t.first + dx[i], y = t.second + dy[i];
if (x >= 0 && x < n && y >= 0 && y < m && g[x][y] == 0 && d[x][y] == -1){ // 找到符合条件的点。
d[x][y] = d[t.first][t.second] + 1; // 用该点存放距离,t里的点为上次的点,表示从t点走到(x,y)这个点,因此距离加一。
q.push({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;
}