当前位置:   article > 正文

BFS(宽度优先搜索、广度优先搜索)

BFS(宽度优先搜索、广度优先搜索)

宽度优先搜索算法(又称广度优先搜索)是最简便的图的搜索算法之一,这一算法也是很多重要的图的算法的原型。Dijkstra单源最短路径算法和Prim最小生成树算法都采用了和宽度优先搜索类似的思想。其别名又叫BFS,属于一种盲目搜寻法,目的是系统地展开并检查图中的所有节点,以找寻结果。换句话说,它并不考虑结果的可能位置,彻底地搜索整张图,直到找到结果为止 。

 

BFS算法常用于求最短路径或者求扩散性质的区域问题。

(1)走迷宫最短路径

(2)数字按规则转换的最少次数

(3)棋盘上某个棋子N步后能到达的位置总数

(4)病毒扩散计算

(5)图像中连通块的计算。

模板

可以分为四个步骤:初始化(初始化队列和所求的值) -> 判空取队头(判断是否为空并取出队头) -> 拓展(利用队头去扩展)->依次四个方向 -> 判断入队(如果符合,将该点入队)。

  1. void bfs(){
  2. queue<int>q;
  3. //此处定义一个哈希map存距离或者定义全局二维数组存距离
  4. q.push(初始位置);
  5. //初始位置距离赋值0
  6. int dx[4]={-1,0,1,0},dy[4]={0,1,0,-1};//四个方向上的向量
  7. while(q.size()){
  8. auto t = q.front();
  9. q.pop();//取出队头的点,用该点向周围扩散。
  10. for(int i=0;i<4;i++){
  11. int a= ,b=
  12. if(check(j)){ //如果该点可行就将它加入队列中
  13. q.push(j);
  14. //实施相应的操作
  15. }
  16. }
  17. }
  18. }

 

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. const int N=110;
  4. typedef pair<int ,int> PII;
  5. int n,m;
  6. int g[N][N];//存放地图
  7. int d[N][N];//存放该点到起点的距离
  8. int bfs(){
  9. queue<PII> q;
  10. memset(d, -1 ,sizeof d);//将值全部初始化为-1 代表还没有走过
  11. d[0][0]=0;//第一个点已经走过
  12. q.push({0,0});//将起点插入队列中
  13. int dx[4]={-1,0,1,0},dy[4]={0,1,0,-1};//四个方向上的向量
  14. while(q.size()){//判断队列是否为空
  15. auto t=q.front();//取出对头元素
  16. q.pop();//弹出队头元素
  17. for(int i=0;i<4;i++){
  18. int x=t.first+dx[i],y=t.second+dy[i];
  19. if(x>=0&&x<n&&y>=0&&y<m&&g[x][y]==0&&d[x][y]==-1){//x、y符合条件 该位置为0 且没有走过
  20. d[x][y]=d[t.first][t.second]+1;//离起点距离加 1
  21. q.push({x,y});//坐标入队
  22. }
  23. }
  24. }
  25. return d[n-1][m-1];
  26. }
  27. int main(){
  28. cin>>n>>m;
  29. for(int i=0;i<n;i++)
  30. for(int j=0;j<m;j++)
  31. cin>>g[i][j];
  32. cout<<bfs()<<endl;
  33. return 0;
  34. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/weixin_40725706/article/detail/386116
推荐阅读
相关标签