关于 bfs广度优先搜索

·bfs是什么

 bfs是最简便的图的搜索算法之一。目的是系统地展开并检查图中的所有节点,以找寻结果。简单来说,就是从一个点开始先寻找四周,再向更深的地方搜索。单的BFS只能通过输出来表示最短路的步数长度,不能表示出最短路径到底是什么

·bfs的原理

 由队列的形式实现的。常用stl中的queue。

队列的操作非常简单,主要有以下几个:
q.push() 入队操作
q.front() 取队头元素
q.pop() 队头元素出队
q.size() 获取队列的元素个数
q.empty() 判断队列是否为空,为空返回true,不为空返回false

·bfs的基本思想

1、对于初始状态入队,设置初始状态为已访问
2、如果队列不为空时,出队队头元素,否则跳到第5步
3、检查出队的元素是否为最终解,如果是则跳到第5步。
4、对于出队的元素,检查所有相邻状态,如果有效并且未访问,则将
   所有有效的相邻状态进行入队,并且设置这些状态为已访问,然后
   跳到第2步重复执行
5、检查最后出队的元素是否为最终解,如果是输出结果,否则说明无解

·bfs的一个模板

int bfs(int sx,int sy)
{
  q.push((Pos){sx,sy}); //起点加入队列
  vis[sx][sy]=true; //标记
  while(!q.empty()) 
  {
      x=q.front().x;
      y=q.front().y; //获取起始坐标
      q.pop(); //弹出队列
      if(符合条件) return ans(答案); 
      for(int i=0;i<走法;i++)
      {
          tx=x+dx[i];
          ty=y+dy[i];
          if(符合条件) continue;
          if(符合条件) continue; //符合条件跳过循环
          /*
                         可行,执行该部分语句
                                                    */
          q.push((Pos){tx,ty}); //加入队列
      }
  }
}

·bfs与dfs的区别

 bfs的重点在于队列,而dfs的重点在于递归。

 bfs更适合用来搜索最短径路的步数解,而dfs适合搜索全部的解。

 bfs搜到就是最优解,dfs找到的不一定是最优解。

 

posted @ 2022-03-27 21:13  爱吃虾滑  阅读(26)  评论(0编辑  收藏  举报