算法刷题7(C++)BFS算法
一、算法概述
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算法相关推荐
- [AcWing算法刷题]之DFS+BFS迷宫模板(简单)
题目来源: 题库 - AcWing 目录 DFS和BFS模板题目:迷宫类 机器人的运动范围 字母 迷宫 红与黑 棋盘问题 马走日 全球变暖 DFS综合类 乘积最大(提高课) 单词接龙(提高课) 取石 ...
- 算法刷题重温(九): 排序算法来啦
1. 写在前面 这篇文章复习排序算法, 排序算法的重要性也是不言而喻, 并且面试的时候经常会问到第K大,第K小,前K大,前K小的问题, 这往往都是排序算法的解决范畴. 在实际问题中,排序算法也是应用非 ...
- 搬砖试金石!github星标7W算法刷题宝典,还愁拿不下大厂offer?
前言 这几年IT技术蓬勃发展,日新月异,对技术人才的需求日益增长,程序员招聘市场也如火如荼.在有限的三五轮面试中,国外流行让面试者编程解决某些数据结构和算法的题目,通过观察面试者编码的熟练程度.思考的 ...
- 【c++算法刷题笔记】——洛谷2
1. 洛谷练习--P1579 哥德巴赫猜想(升级版) 题目描述: 现在请你编一个程序验证哥德巴赫猜想. 先给出一个奇数n,要求输出3个质数,这3个质数之和等于输入的奇数. 输入格式: 仅有一行,包含一 ...
- 找到所有数组中消失的数字_【一点资讯】千万程序员的呼声:面试如何拿到大厂Offer?这份阅读量超过11W+的算法刷题宝典请你原地查收 www.yidianzixun.com...
如何才能通过面试拿到大厂Offer? "刷leetcode!" 这是我听到最多的回答! 现在越来越多的人应聘工作时都得先刷个几十百来道题,不刷题感觉都过不了面试. 无论是面测试.算 ...
- 字节跳动算法刷题宝典.pdf
今天推荐一个关于「算法刷题宝典」的开源项目:力扣Cookbook. 力扣 Cookbook是@halfrost(中文名:霜神)去年刷的 力扣整理出的 520 题,每道题都写了解题思路,并且每题都 ru ...
- Github最强算法刷题笔记.pdf
资料一 昨晚逛GitHub,无意中看到一位大佬(https://github.com/halfrost)的算法刷题笔记,感觉发现了宝藏!有些小伙伴可能已经发现了,但咱这里还是忍不住安利一波,怕有些小伙 ...
- 算法刷题宝典.pdf
今天推荐一个关于「算法刷题宝典」的开源项目:力扣Cookbook. 力扣 Cookbook是@halfrost(中文名:霜神)去年刷的 力扣整理出的 520 题,每道题都写了解题思路,并且每题都 ru ...
- Leetode算法刷题宝典.pdf
今天推荐一个关于「算法刷题宝典」的开源项目:力扣Cookbook. 力扣 Cookbook是@halfrost(中文名:霜神)去年刷的 力扣整理出的 520 题,每道题都写了解题思路,并且每题都 ru ...
最新文章
- saltstack(十二)job管理
- React创建组件的三种方式及其区别
- 全球及中国微生物气溶胶采样器行业十四五”发展规划及运营前景研究报告2021年版
- ros和java通讯_ROS学习之路(二)——通信架构(上)
- 怎么损坏mysql_如何修复MySQL中损坏的表
- EF Core查询标签TagWith
- OpenCV-CL: OpenCL加速计算机视觉技术
- Spring的注解问题
- (第一章)数据库的类型
- 10分钟开始使用ICTCLAS Java版
- 最常见30种NLP任务练手项目汇总
- WinForm:API
- linux用户名不在sudoers,如何修复“用户名不在sudoers文件中。这个事件将报告“在Ubuntu...
- GNN-频域-2016:ChebNet【频谱图卷积】【切比雪夫多项式(ChebShev Polynomial)】【应用切比雪夫多项式加速特征矩阵求解】【GCN来源于对ChebNet的进一步简化与近似】
- 1123581321递归算法java_斐波那契数列的算法
- 压电式雨量传感器介绍说明
- 基于AM5728 linux开源ethercat运动控制一体机解决方案
- Woodbury矩阵恒等式介绍
- linux电脑关机命令是什么问题,linux下正常关机之命令详解 -电脑资料
- 离散正弦变换(DST)实现(cpu和cuda)
热门文章
- java 创建dat文件怎么打开,dat文件怎么打开有哪些
- html展示列表,如何在HTML中展示列表?
- HTML--嵌套列表的使用(一)
- 美颜滤镜:早已不是简单的磨皮美白
- c语言n1.n2%,C语言题库填空.doc
- 二叉树的非递归遍历和层次遍历详解
- Linux下QoS模块之tc(traffic control)操作简介/CBQ
- 破解所谓的ISP封路由的方法大集合
- python读取文件属性详细信息_Python os.stat()函数:获取文件基本信息
- php 递归算法,解读php全排列递归算法代码