宽度优先搜索基础
宽度优先搜索和深度优先搜索的区别是,宽度优先要先让当前点横向到达所有可以一步到达的点,判断在这些点中是否有自己需要的终点(注意别重复走,要去重),如果有就停下来,这样可以找出最短路径,如果没有就将这些点放入队列中用于下一次的更新,也就是说每一次都是从一个点开始走到尽可能多的点上去
思路:最小移动次数利用深度优先搜索即可,从开始点开始计算所有一步可以到达的点,打上标记,然后用一步可以到达的点去找所有可以两步到达的点,依此类推直到到达终点。这里需要注意的是,为什么某个点第一次被遍历它就一定是该点据起点的最短路径,这个问题结合队列的特性显而易见。
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#include<queue>
#define x first
#define y second
using namespace std;
typedef pair<int, int> PII;
const int N = 110;
int a[N][N];
int dist[N][N];
int n, m;
int bfs()
{
memset(dist, -1, sizeof(dist));//将所有点距离起点的距离标记为-1,意为全部没有被遍历过
dist[0][0] = 0;//将起点的距离改为0,用于后续其它点的距离的更新
queue<PII> q;//队列
q.push({0, 0});
int dx[] = {-1, 0, 1, 0}, dy[] = {0, -1, 0, 1};//一个点可以走的四个方向的坐标变化
while(q.size())
{
auto t = q.front();
q.pop();
for(int i = 0; i < 4; i ++)
{
int x = t.x + dx[i], y = t.y + dy[i];
if(x >= 0 && x < n && y >= 0 && y < m && a[x][y] == 0 && dist[x][y] == -1)//判断当前点是否越界,是否已经走过了
{
dist[x][y] = dist[t.x][t.y] + 1;
q.push({x, y});
}
}
}
return dist[n - 1][m -1];//返回终点距离起点的距离
}
int main()
{
scanf("%d%d", &n, &m);
for (int i = 0; i < n; i++)
for(int j = 0; j < m; j ++)
scanf("%d", &a[i][j]);
printf("%d\n", bfs());
return 0;
}
本文来自博客园,作者:LYL233,转载请注明原文链接:https://www.cnblogs.com/amour233/p/16469229.html
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】