一、算法概述

BFS算法本质就是从起点到终点找到最近的距离。

BFS算法核心把一个问题抽象成图,从一个点开始,向四周开始扩散。

比DFS的空间复杂度大。

二、算法框架

int BFS(Node start, Node target){Queue<Node> q; //核心数据结构Set<Node> visited;int step = 0;q.push(start); //从当前点开始visited.insert(start);while(!q.empty*()){int sz = q.size();{node cur = q.front();q.pop();if( cur is target) //排队呢是否达到targetreturn step;for(int cur_temp=cur.adj()) //adj()函数是指cur上下左右的值{if(cur_temp not in visited){q.push(cur_temp );visited.insert(cur_temp )} }}//划重点: 更新步数在这⾥ step++;/}}

三、C++走迷宫BFS算法案例

#include <iostream>#include <cstdio>
#include <queue>
#include <set>
#include<algorithm>/*
这里有一个5 * 5的迷宫,1是墙,0是路,那么从左上角走道右下角最少需要多少步呢?
0 1 0 0 0
0 1 0 1 0
0 0 0 0 0
0 1 1 1 0
0 0 0 1 0
首先把终点设为3,走过的路设为2,
*/
using namespace std;
int Map[5][5] = {0,1,0,0,0    ,0,1,0,1,0, 0,0,0,0,0 ,0,1,1,1,0 ,0,0,0,1,0};  //定义地图大小
int dir[4][2] = { 1,0,-1,0,0,-1,0,1 };  //定义方向
int n, m, ans;
struct node
{int x, y;//node() {}node(int _x, int _y){this->x=_x;this->y=_y;}bool operator<(const struct node & right)const   //重载<运算符{if(this->x == right.x && this->y == right.y )     //根据x,y去重return false;else{if(this->x != right.x){return this->x > right.x;      //降序}else{return this->y > right.y;     }}}};  //保存走步node plusOne(struct node cur, int i)
{node cur_temp(0,0);if (i == 0){cur_temp.x = cur.x + 1;cur_temp.y = cur.y;}if (i == 1){cur_temp.x = cur.x - 1;cur_temp.y = cur.y;}if (i == 2){cur_temp.x = cur.x;cur_temp.y = cur.y +1;}if (i == 3){cur_temp.x = cur.x;cur_temp.y = cur.y - 1;}if (cur_temp.x < 0 || cur_temp.y < 0 || cur_temp.x >=5 || cur_temp.y >=5){cur_temp.x = -1;cur_temp.y =-1;}return cur_temp;
}set <node> visited;
queue<node> q;
int BFS( node start,   node  target)
{int step = 0;q.push(start);  //从当前点开始//visited.insert(node(start.x, start.y));visited.insert(start);while (!q.empty()){int sz = q.size();for (int i=0;i<sz;i++){ // node cur = q.front();//q.pop();node cur = q.front();q.pop();if ((cur.x==target.x) &&(cur.y == target.y)) //判断是否到达targetreturn step;for (int j = 0;j<4;j++){node cur_temp(0,0);cur_temp = plusOne(cur, j);//( find(visited.begin(), visited.end(), x)!= visited.end())  &&if (((cur_temp.x!= -1) && (cur_temp.y!=-1)) && Map[cur_temp.x][cur_temp.y]==0){q.push(cur_temp);node d =  node(cur_temp.x,cur_temp.y);//visited.insert(node(cur_temp.x, cur_temp.y));//d.x = cur_temp.x;//d.y = cur_temp.y;visited.insert(d);}}}//划重点:更新步数在这里step++;}}int main(int argc, char * argv[])
{//输入地图
/*  for (int i = 0; i<5; i++)    for (int j = 0; j<5; j++)cin >> Map[i][j];*///Map[4][4] = 3;  //定义终点node start(0,0),target(4,4);// start.x = 0;// start.y = 0;// target.x = 4;// target.y = 4;ans = BFS(start, target);cout << ans << endl;for(std::set<node>::iterator it=visited.begin() ;it!=visited.end();++it){std::cout<<"x:"<<it->x<<",y:"<<it->y<<std::endl;}return 0;}

//set 使用有问题

算法刷题7(C++)BFS算法相关推荐

  1. [AcWing算法刷题]之DFS+BFS迷宫模板(简单)

    题目来源: 题库 - AcWing 目录 DFS和BFS模板题目:迷宫类 机器人的运动范围​ 字母 迷宫 红与黑 棋盘问题 马走日 全球变暖 DFS综合类 乘积最大(提高课) 单词接龙(提高课) 取石 ...

  2. 算法刷题重温(九): 排序算法来啦

    1. 写在前面 这篇文章复习排序算法, 排序算法的重要性也是不言而喻, 并且面试的时候经常会问到第K大,第K小,前K大,前K小的问题, 这往往都是排序算法的解决范畴. 在实际问题中,排序算法也是应用非 ...

  3. 搬砖试金石!github星标7W算法刷题宝典,还愁拿不下大厂offer?

    前言 这几年IT技术蓬勃发展,日新月异,对技术人才的需求日益增长,程序员招聘市场也如火如荼.在有限的三五轮面试中,国外流行让面试者编程解决某些数据结构和算法的题目,通过观察面试者编码的熟练程度.思考的 ...

  4. 【c++算法刷题笔记】——洛谷2

    1. 洛谷练习--P1579 哥德巴赫猜想(升级版) 题目描述: 现在请你编一个程序验证哥德巴赫猜想. 先给出一个奇数n,要求输出3个质数,这3个质数之和等于输入的奇数. 输入格式: 仅有一行,包含一 ...

  5. 找到所有数组中消失的数字_【一点资讯】千万程序员的呼声:面试如何拿到大厂Offer?这份阅读量超过11W+的算法刷题宝典请你原地查收 www.yidianzixun.com...

    如何才能通过面试拿到大厂Offer? "刷leetcode!" 这是我听到最多的回答! 现在越来越多的人应聘工作时都得先刷个几十百来道题,不刷题感觉都过不了面试. 无论是面测试.算 ...

  6. 字节跳动算法刷题宝典.pdf

    今天推荐一个关于「算法刷题宝典」的开源项目:力扣Cookbook. 力扣 Cookbook是@halfrost(中文名:霜神)去年刷的 力扣整理出的 520 题,每道题都写了解题思路,并且每题都 ru ...

  7. Github最强算法刷题笔记.pdf

    资料一 昨晚逛GitHub,无意中看到一位大佬(https://github.com/halfrost)的算法刷题笔记,感觉发现了宝藏!有些小伙伴可能已经发现了,但咱这里还是忍不住安利一波,怕有些小伙 ...

  8. 算法刷题宝典.pdf

    今天推荐一个关于「算法刷题宝典」的开源项目:力扣Cookbook. 力扣 Cookbook是@halfrost(中文名:霜神)去年刷的 力扣整理出的 520 题,每道题都写了解题思路,并且每题都 ru ...

  9. Leetode算法刷题宝典.pdf

    今天推荐一个关于「算法刷题宝典」的开源项目:力扣Cookbook. 力扣 Cookbook是@halfrost(中文名:霜神)去年刷的 力扣整理出的 520 题,每道题都写了解题思路,并且每题都 ru ...

最新文章

  1. saltstack(十二)job管理
  2. React创建组件的三种方式及其区别
  3. 全球及中国微生物气溶胶采样器行业十四五”发展规划及运营前景研究报告2021年版
  4. ros和java通讯_ROS学习之路(二)——通信架构(上)
  5. 怎么损坏mysql_如何修复MySQL中损坏的表
  6. EF Core查询标签TagWith
  7. OpenCV-CL: OpenCL加速计算机视觉技术
  8. Spring的注解问题
  9. (第一章)数据库的类型
  10. 10分钟开始使用ICTCLAS Java版
  11. 最常见30种NLP任务练手项目汇总
  12. WinForm:API
  13. linux用户名不在sudoers,如何修复“用户名不在sudoers文件中。这个事件将报告“在Ubuntu...
  14. GNN-频域-2016:ChebNet【频谱图卷积】【切比雪夫多项式(ChebShev Polynomial)】【应用切比雪夫多项式加速特征矩阵求解】【GCN来源于对ChebNet的进一步简化与近似】
  15. 1123581321递归算法java_斐波那契数列的算法
  16. 压电式雨量传感器介绍说明
  17. 基于AM5728 linux开源ethercat运动控制一体机解决方案
  18. Woodbury矩阵恒等式介绍
  19. linux电脑关机命令是什么问题,linux下正常关机之命令详解 -电脑资料
  20. 离散正弦变换(DST)实现(cpu和cuda)

热门文章

  1. java 创建dat文件怎么打开,dat文件怎么打开有哪些
  2. html展示列表,如何在HTML中展示列表?
  3. HTML--嵌套列表的使用(一)
  4. 美颜滤镜:早已不是简单的磨皮美白
  5. c语言n1.n2%,C语言题库填空.doc
  6. 二叉树的非递归遍历和层次遍历详解
  7. Linux下QoS模块之tc(traffic control)操作简介/CBQ
  8. 破解所谓的ISP封路由的方法大集合
  9. python读取文件属性详细信息_Python os.stat()函数:获取文件基本信息
  10. php 递归算法,解读php全排列递归算法代码