当前位置: 首页 > news >正文

数据结构与算法——BFS(广度优先搜索)

算法介绍:

广度优先搜索(Breadth-First Search,简称BFS)是一种遍历或搜索树和图的算法,也称为宽度优先搜索,BFS算法从图的某个节点开始,依次对其所有相邻节点进行探索和遍历,然后再对这些相邻节点的相邻节点进行探索,直到遍历完所有的节点。BFS算法使用队列来辅助实现,将起始节点放入队列中,然后依次取出队列中的节点,访问其相邻节点,并将其加入队列。这样可以保证从起始节点出发,依次按照距离顺序遍历节点。BFS常用于寻找最短路径,因为它按照从起点到每个节点的距离来探索节点。

在ACM、蓝桥杯等著名竞赛中BFS算法是比较重要的,特别是在蓝桥杯中每一年几乎都要考DFS/BFS算法。BFS算法在OI赛中用处非常大,可以通过DFS/BFS暴力的方式可以拿到部分分数,蓝桥杯一般可以拿到20%的分数,有的甚至高达50%,是暴力得分的不二之选。

基本步骤:

BFS算法通常使用队列来实现,BFS算法的具体步骤如下:

  1. 创建一个队列,将起始节点加入队列;
  2. 创建一个集合,用于存储已经访问过的节点;
  3. 从队列中取出一个节点,并将其标记为已访问;
  4. 访问该节点的所有相邻节点,如果相邻节点未被访问,则将其加入队列;
  5. 重复步骤3和步骤4,直到队列为空。

BFS算法可以用来解决一些问题,例如图的遍历、最短路径搜索等。由于BFS算法保证了按照距离顺序遍历节点,因此可以用来寻找最短路径。另外,BFS算法还可以用来判断图是否连通,即从一个节点是否可以到达另一个节点。


图解算法:

下面放一张我们学校ACM在大一培训时使用的一张动态BFS/DFS步骤图。注:红色遍历为BFS、黄色遍历为DFS。(绿色为起点,紫色为终点,黑色为障碍物)

由上图中我们可以看出,BFS的遍历为四周扩散,用我们学长的话说就是周围每个点都尝试一下,无脑走,直到找到终点。由此我们可以看出来,BFS这种无脑走必定会导致时间复杂度非常高,如果终点离起点非常远,那么几乎每个点都要遍历一下,这样的话BFS这种算法就不适合了,BFS适合于点少的图,求最短距离之类的。BFS一般通过队列来实现。

下面我们将以5*5的网格,考虑{上、右上、右、右下、下、左下、左、左上}八个方向,遍历顺序为{上、右上、右、右下、下、左下、左、左上}由上开始顺时针方向,顺序可按照自己的想法,顺序不一定固定,给大家模拟实现一下过程。

:为方便表示,对于下面的叫法特此说明,起点.上表示起点上面的格子,起点.上右表示起点右上方的格子,其他方向类似,起点.上.上右表示起点的上面格子的右上方格子。

第一步:

初始起点入队,标记起点vis[起点]==true,说明起点已经被访问了,判断起点是否为终点,起点出队,很明显不是那么从起点周围按照{上、右上、右、右下、下、左下、左、左上}的顺序八个方向遍历每一个格子,将它们一一入队,并且将它们标记为已经访问过了,即vis[八个方向]=true。

第二步:

由于我们第一步按照{上、右上、右、右下、下、左下、左、左上}的顺序入队的,此时队中的顺序是起点的{上、右上、右、右下、下、左下、左、左上}方向,那么此时出队的第一个是{上}方向,我们去遍历{上}方向的八个方向,由于{上}方向的八个方向中{上、右上、左上}三个方向下标越界,其他的都已经被访问过了,不合法,直接continue忽略掉,{上}方向遍历完成,{上}方向出队。

第三步:

此时要出队的为{上右}方向,先标记{上右}方向,然后遍历{上右}方向的八个方向,我们发现只有{上右}方向的{右}方向跟{下右}方向是合法的,其他的方向要么下标越界,要么已经被访问了,那么把{上右}方向的{右}方向跟{上右}方向的{下右}方向入队,并且标记它们的vis为true。

第四步:

此时队头的为起点的{右}方向,将它出队,判断它不是终点,那么遍历它的八个方向,发现只有它的{右下}方向是合法的,其他方向都已经被标记过了。那么将vis[右下]标记为true,将它的右下方向入队。

第五步:

此时队头的为起点的{下右}方向,将它出队,判断它不是终点,那么遍历它的八个方向,发现它的{右下、下、左下}方向是合法的,其他方向都已经被标记过了。那么将vis[右下、下、左下]标记为true,并且将其入队。此时我们发现它的右下方向是终点了,已经在栈队当中,再经过八次出队,那么就是这个出队的点就是终点了,判断完成后此时BFS搜索就结束了,由于下面都是相同的出队入队步骤,下面不再详解。


算法模板:

首先我们需要一个队列来辅助BFS实现,还需要一个初始化的输入数组,还有一个标记数组。先找到BFS的起点跟终点,确定好之后,先把起点vis==true,把起点入队,然后进入BFS函数,进入BFS函数一般先是一个大while循环,来管理队列的入队、出队。由于点都是二维的,我们一般都是用pair或者结构体来表示点,新建一个点来存储队头的信息,存完就可以让队头出队了。然后判断是否到达了目标结点,一个if判断,下面就是跟dfs一样,一个for循环遍历周围所有的点,不合法的直接continue掉,合法的标记完vis后入队,有的题目会有回溯,像在部分最短路搜索。

queue<node> q;
void bfs(){while(!q.empty()){node tmp=q.top();//node为(x,y)结构体q.pop();//出队if(到达目标终点){更新return;}//有的会有剪枝for(int i=0;i<m;i++){//m个方向int dx=tmp.x+bx[i];int dy=tmp.y+by[i];if(下标越界){continue;}if(已经被标记过了){continue;}//否则就是合法的vis[dx][dy]=1;//先标记q.push(node{dx,dy});//再新点入队}}
}

算法例题:

现在各大算法刷题网站上bfs题目非常的多,bfs题目的变化也比较多,现在各种各样的题目层出不穷,bfs考察的还是主要分为图的遍历问题、最短路问题、连通块搜索等,下面博主选取几个比较具有代表性的给大家讲解一下,加深理解一下bfs算法。


一、图的遍历问题

迷宫问题
【题目描述】

一天Extense在森林里探险的时候不小心走入了一个迷宫,迷宫可以看成是由n×n的格点组成,每个格点只有2种状态,.和#,前者表示可以通行后者表示不能通行。同时当Extense处在某个格点时,他只能移动到东南西北(或者说上下左右)四个方向之一的相邻格点上,Extense想要从点A走到点B,问在不走出迷官的情况下能不能办到。如果起点或者终点有一个不能通行(为#),则看成无法办到。

【输入】

第1行是测试数据的组数k,后面跟着k组输入。每组测试数据的第1行是一个正整数n(1≤n≤ 100),表示迷宫的规模是n×n的。接下来是一个n×n的矩阵,矩阵中的元素为.或者#。再接下来一行是4个整数ha,la,hb,lb,描述A处在第ha行,第la列,B处在第hb行,第lb列。注意到ha,la,hb,lb全部是从0开始计数的。

【输出】

k行,每行对应一个输出,如果能到达则输出"YES",否则输出"NO"。

【样例】
2
3
.##
..#
#..
0 0 2 2
5
.....
###.#
..#..
###..
...#.
0 0 4 0YES
NO
解题思路:

这类问题属于图的遍历问题,属于BFS题里面最简单的问题,直接利用BFS的思想遍历即可,判断是否能到达。之所以选这个题,是先让刚入门的小萌新熟悉一下BFS的步骤、思想。大佬可跳过此题。

AC代码:
#include<iostream>
#include<queue>
#include<cstring>
using namespace std;
int n,t;
char ch[105][105];
bool flag=false,vis[105][105];
int sx,sy,fx,fy;
int bx[]={0,0,1,-1},by[]={1,-1,0,0};//方向数组
struct node{int x,y;
};
queue<node> q;//队列
void bfs(){while(!q.empty()){node tmp=q.front();//取队头元素q.pop();//出队if(tmp.x==fx&&tmp.y==fy){//目标状态flag=true;return;}for(int i=0;i<4;i++){//周围四个方向搜索int dx=tmp.x+bx[i],dy=tmp.y+by[i];if(dx<0||dx>=n||dy<0||dy>=n){//下标越界continue;}if(vis[dx][dy]){//已经被访问过continue;}if(ch[dx][dy]=='#'){//墙壁continue;}vis[dx][dy]=1;//先标记q.push(node{dx,dy});//再入队}}
}
int main(){cin>>t;while(t--){cin>>n;for(int i=0;i<n;i++){for(int j=0;j<n;j++){cin>>ch[i][j];}}cin>>sx>>sy>>fx>>fy;flag=false;memset(vis,0,sizeof(vis));while(!q.empty()){//多次输入,防止上次队列的影响q.pop();}vis[sx][sy]=1;q.push(node{sx,sy});//起点入队bfs();cout<<(flag?"YES":"NO")<<endl;}return 0;
}

二、最短路问题

AcWing 1102. 移动骑士

给定一个 n∗n 的棋盘,以及一个开始位置和终点位置。

棋盘的横纵坐标范围都是 0∼n−1。

将一个国际象棋中的骑士放置在开始位置上,请问将它移动至终点位置至少需要走多少步。

一个骑士在棋盘上可行的移动方式如下图所示:

QQ截图20191016061524.png

输入格式

第一行包含整数 T,表示共有 T 组测试数据。

每组测试数据第一行包含整数 n,表示棋盘大小。

第二行包含两个整数 x,y 用来表示骑士的开始位置坐标 (x,y)。

第三行包含两个整数 x,y 用来表示骑士的终点位置坐标 (x,y)。

输出格式

每组数据输出一个整数,表示骑士所需移动的最少步数,每个结果占一行。

数据范围

4≤n≤300
0≤x,y≤n−1

输入样例:
3
8
0 0
7 0
100
0 0
30 50
10
1 1
1 1
输出样例:
5
28
0
解题思路:

这道题跟马走日那一题几乎是一样的,但是不一样的是这道题是求的最小步数。这就是最短路问题了。还是跟之前的BFS步骤一样,就是在目标状态那里多了一个更新最小步数。这道题比前面的图的遍历问题难一点点,注意,BFS是不需要回溯的,否则会陷入死循环。

AC代码:
#include<iostream>
#include<cstring>
#include<queue>using namespace std;
int t,n;
int sx,sy,fx,fy;//(sx,sy)起点,(fx,fy)终点
struct node{//点结构体int x;int y;int dep;//步数
}Node;
int dx[]={1,1,2,2,-1,-1,-2,-2};//方向数组
int dy[]={2,-2,1,-1,2,-2,1,-1};
bool vis[305][305];//标记数组
int sum=0x3f3f3f;//最小步数
queue<node> q;void bfs(){while(!q.empty()){auto tmp=q.front();q.pop();if(tmp.x==fx&&tmp.y==fy){//目标状态更新最小步数sum=min(sum,tmp.dep);return;}for(int i=0;i<8;i++){//八个方向遍历Node.x=tmp.x+dx[i];Node.y=tmp.y+dy[i];if(Node.x<0||Node.y<0||Node.x>=n||Node.y>=n){//下标越界continue;}if(vis[Node.x][Node.y]==1){//已经被访问过continue;}Node.dep=tmp.dep+1;//步数更新vis[Node.x][Node.y]=1;//先标记q.push(Node);//再入队}}
}int main(){cin>>t;while(t--){memset(vis,false,sizeof(vis));//多组输入置0sum=0x3f3f3f;//初始最大值cin>>n>>sx>>sy>>fx>>fy;vis[sx][sy]=1;//先标记起点while(!q.empty()){//清空队列q.pop();}q.push(node{sx,sy,0});//起点步数为0bfs();cout<<sum<<endl;}return 0;
}

洛谷 P1379 八数码难题
题目描述

在 3×3 的棋盘上,摆有八个棋子,每个棋子上标有 1 至 8 的某一数字。棋盘中留有一个空格,空格用 0 来表示。空格周围的棋子可以移到空格中。要求解的问题是:给出一种初始布局(初始状态)和目标布局(为了使题目简单,设目标状态为 123804765),找到一种最少步骤的移动方法,实现从初始布局到目标布局的转变。

输入格式

输入初始状态,一行九个数字,空格用 0 表示。

输出格式

只有一行,该行只有一个数字,表示从初始状态到目标状态需要的最少移动次数。保证测试数据中无特殊无法到达目标状态数据。

输入 

283104765

输出 

4
样例解释

图中标有 0 的是空格。绿色格子是空格所在位置,橙色格子是下一步可以移动到空格的位置。如图所示,用四步可以达到目标状态。并且可以证明,不存在更优的策略。

解题思路:

这道题在博主做题的感觉来说,题目质量是非常高的,思维也非常有高度,建议大家好好学一下。八数码非常类似于中国的数独游戏。在解决此题时一个布局对应一个字符串也就是一个状态,可以理解为一个布局转换为目标布局所需要的最小步数。

下面讲解一下如何解决此题,我们发现每一个字符串就是一个状态,最短距离还需要记录步数,那么我们就想到了map键值映射,由一个字符串对应初始状态到此状态的最小步数。例如:d["123048567"]=2表示由初始状态到目标状态最小步数为2步完成。其次是‘0’字符一维下标跟二维下标位置转换的技巧,我们发现每一次都是‘0’字符(空格)与四个方向的数字进行交换,属于空格的BFS,对于一维下标可以通过除3为横坐标,模3为纵坐标(3*3棋盘),由二维转为一维坐标倒过来即可,即:3*横坐标+纵坐标。刚开始可以使用find()函数查找‘0’字符的下标,然后转化为布局中的二维坐标。每完成一步就要交换格子,交换完成就得到一种新的布局,那么我们可以用count()函数去map里面查找,如果有这种状态说明之前用更小的步数就已经到达过了,没必要更新了。如果没有这种状态,那么我们就为它赋值最小步数。最后还要还原,对于这个题来说是必要的,因为四个方向搜索都是以‘0’为基础的,for循环一次把他改变了,后面的3次循环就在它前一个状态的基础上。这样交换操作就乱了。

视频讲解: 请看B站up主董晓算法,—>>点击直达<<—,博主感觉董晓老师讲的非常好,本题思路按照董晓老师讲解来写的。大家可以去看看,下面第二张图片来自董晓老师讲解。

AC代码:
#include<iostream>
#include<algorithm>
#include<cstring>
#include<queue>
#include<unordered_map>using namespace std;int dx[]={-1,0,1,0},dy[]={0,1,0,-1};//方向数组
unordered_map<string,int> d;//考虑map键值对映射,状态映射步数
queue<string> q;//棋盘状态布局int bfs(string strat){string end="123804765";//目标状态q.push(strat);//初始状态d[strat]=0;while(q.size()){auto s=q.front();q.pop();if(s==end){//目标状态return d[s];}int k=s.find('0');//下标位置转化int x=k/3;int y=k%3;for(int i=0;i<4;i++){//四个方向搜索int a=x+dx[i];int b=y+dy[i];if(a<0||a>=3||b<0||b>=3){//下标越界continue;}int distance=d[s];//记录步数swap(s[k],s[3*a+b]);//交换if(!d.count(s)){//新的布局d[s]=distance+1;q.push(s);}swap(s[k],s[3*a+b]);//还原}}return -1;//无法到达
}int main(){string strat;for(int i=0;i<9;i++){char ch;cin>>ch;strat+=ch;}cout<<bfs(strat)<<endl;return 0;
}

三、连通块问题

第十四届省赛大学B组(C/C++)岛屿个数

到目前为止我做过像连通块问题的题用BFS解的就这一个比较好,这一道题跟连通块有结合,博主才把它归到了连通块问题来。具体的讲解跟AC代码,请看我这一篇文章,文章单独讲解了这一道题,由于文章长度限制这里不再详解,请移步下面链接。

第十四届省赛大学B组(C/C++)岛屿个数-CSDN博客文章浏览阅读1.1k次,点赞30次,收藏14次。这不是普通的DFS/BFS搜索题,看着很像最少连通块,但是题目中又有了新的定义就是在陆地环里面(被陆地包围)也算属于此外围岛屿,那么我们就也要判定这种环岛屿,博主的思路是先BFS也可DFS找出连通块的个数(四个方向),建一个vector把连通块的起点存进去,方便去找环岛屿,只要有一个起点(或者此连通块任意一个点),此连通块的点便可通过移动一网打尽,再BFS(或者DFS)判定该岛屿是否属于这种环岛屿,不属于就结果加一,属于就不用加。对于 100% 的评测用例,1≤T≤10,1≤M,N≤50。https://blog.csdn.net/m0_73633807/article/details/137248445?spm=1001.2014.3001.5501


图形搜索算法还有一种是DFS,请看博主上一篇文章数据结构与算法——DFS(深度优先搜索)

制作不易,如果对你有所帮助请三连支持博主持续创作,感谢各位大佬的支持。

相关文章:

数据结构与算法——BFS(广度优先搜索)

算法介绍&#xff1a; 广度优先搜索&#xff08;Breadth-First Search&#xff0c;简称BFS&#xff09;是一种遍历或搜索树和图的算法&#xff0c;也称为宽度优先搜索&#xff0c;BFS算法从图的某个节点开始&#xff0c;依次对其所有相邻节点进行探索和遍历&#xff0c;然后再…...

登录 k8s-Dashboard 显示 Your connection is not private

文章目录 一、背景二、解决方案 一、背景 部署好 kubernetes-Dashboard 后使用 master节点的 ipport 登录 Dashboard 显示 Your connection is not private 无论是 Edge 还是 Google Chrome 都是这样的情况 二、解决方案 点击网页空白处&#xff0c;英文输入法输入&#xf…...

【Bifrost】ubuntu24.04 远程构建及clion设置编码风格google

Bifrost 构建通过clion 远程到ubuntu24.04 构建感觉是不认识这种写法,这种至少是c++11 fix : 修改absl 的构建cmakelist,明确c++17 好像还是不行error: ‘uint8_t’ was not declared in this scope加入:#include <stdint.h>可以解决一部分。那么,这种呢?/home/zha…...

批量查询全国快递单号:高效追踪物流信息

在日常生活和工作中&#xff0c;我们经常会遇到需要查询多个快递单号物流信息的情况。如果手动逐一查询&#xff0c;不仅效率低下&#xff0c;而且容易出错。为了解决这个问题&#xff0c;我们可以借助固乔科技推出的【固乔快递查询助手】软件&#xff0c;轻松实现全国快递的批…...

DVWA | CSRF(LowMedium)攻击的渗透实践

目录 概述 Low Medium 概述 CSRF&#xff08;Cross-Site Request Forgery&#xff0c;跨站请求伪造&#xff09; 是一种网络攻击方式。 通过伪造当前用户的行为&#xff0c;让目标服务器误以为请求由当前用户发起&#xff0c;并利用当前用户权限实现业务请求伪造。 例如&a…...

Tmagic-editor低代码底层拖拽库Moveable示例学习

在前面咱们的自研低代码海报制作平台学习分享计划中分享了自己开发的基本拖拽组件&#xff0c;也只是做了最简单的基本实现。真要写产品&#xff0c;更多还是依赖相关的开源优秀库。 文章目录 参考基本拖拽基本缩放基本Scalable基本旋转基于原点的拖拽和旋转关于练习源码 参考 …...

公开测评:文件防泄密系统哪家好|4款文件防泄密软件推荐

在文件防泄密系统领域&#xff0c;有多款软件以其高效、安全和全面的功能脱颖而出&#xff0c;为企业数据保护提供了有力支持。以下是四款值得推荐的文件防泄密软件&#xff0c;它们各具特色&#xff0c;能够满足不同企业的数据安全需求。 1. 安企神软件 7天试用版https://wor…...

【wiki知识库】09.欢迎页面添加(统计浏览量)Vue修改

目录 ​编辑 一、今日目标 二、新增the-welcome组件 2.1 template 2.2 script 2.2.1 getStatistic 2.2.2 get30DayStatistic 一、今日目标 上篇文章链接&#xff1a;【wiki知识库】08.添加用户登录功能--前端Vue部分修改-CSDN博客 今天就要实现最后的东西了&#xff0c…...

ui自动化难点

位置坐标&#xff1a;可以通过滑动等方式实现 颜色显示&#xff1a;UIAuto.DEV (devsleep.com) --此工具可以解决很多属性上无法解决的问题 原理&#xff1a; 对系统控件的选择和点击实现该方法...

静态路由与默认路由和实验以及ARP工作原理

目录 1.静态路由和默认路由 1.1 静态路由 1.2 默认路由 1.3 主要区别总结 2.实验 2.1 实验 2.1.1 实验top 2.1.2 实验要求 2.2 实验配置 2.2.1 ip信息配置 2.2.2 配置静态 2.2.3配置默认 2.3 实验结果查看 3.为什么第一个ping会显示丢包&#xff1f; 3.1 ARP 工…...

美国洛杉矶大带宽服务器的运维与监控

美国洛杉矶的大带宽服务器因其优越的地理位置、高速的网络连接以及充足的带宽资源&#xff0c;在全球范围内享有很高的声誉。为了确保这些服务器的稳定运行和高效服务&#xff0c;运维与监控工作显得尤为重要。以下是一些关于美国洛杉矶大带宽服务器运维与监控方面的科普内容。…...

AtCoder Beginner Contest 367 A~D

本期封面原图 画师えびら A - Shout Everyday 题意 b点睡觉c点起床&#xff0c;问你a点是不是醒着的 思路 直接判断即可&#xff0c;注意处理跨天的情况 代码 #include <bits/stdc.h> #define mod 998244353 using namespace std; typedef long long ll; typedef …...

oracle 保留两位小数

在Oracle数据库中&#xff0c;保留两位小数可以通过多种函数实现&#xff0c;主要包括ROUND、TRUNC和TO_CHAR函数。每种函数都有其特定的使用场景和效果。 1. ROUND函数 ROUND函数用于对数值进行四舍五入操作&#xff0c;保留指定的小数位数。其基本语法为&#xff1a; ROUN…...

Aop切面技术之存储用户信息

一、背景 在我们日常项目中&#xff0c;常常会将用户的认证信息存入缓存中&#xff0c;方便我们在程序执行中&#xff0c;进行获取用户信息。本篇文章主要是介绍使用自定义注解和AOP切面技术进行实现&#xff0c;这也也是非常容易使用的。 二、代码详解 2.1 自定义注解 定义…...

FreeBSD 针对OpenSSH 高危漏洞发布紧急补丁

近日&#xff0c;FreeBSD 项目的维护者针对OpenSSH 高危漏洞发布了紧急补丁。该漏洞被追踪为 CVE-2024-7589&#xff0c;CVSS 得分为 7.4&#xff08;最高分为 10.0&#xff09;。通过利用该漏洞&#xff0c;黑客能够在权限提升的情况下远程执行任意代码。 根据上周发布的一份…...

【C语言小项目】五子棋游戏

目录 前言 一、游戏规则 1.功能分析 2.玩法分析 3.胜负判定条件 二、游戏实现思路 三、代码实现与函数封装 1.项目文件创建 2.头文件说明 3.函数封装 1&#xff09;菜单实现 2&#xff09;进度条实现 3&#xff09;main函数实现 4&#xff09;Game函数 5&#xff0…...

基于Java语言的能源管理系统-水电气热油数据采集系统

基于Java语言的能源管理系统-水电气热油数据采集系统 介绍 适用于高能耗企业、建筑、工厂、园区的水、电、气、热、油、空压机等能源数据采集、分析、报表&#xff1b; 基于SpringCloud的能源管理系统-能源管理平台源码-能源在线监测平台-双碳平台源码-SpringCloud全家桶-能管…...

人工智能在肿瘤亚型分类领域的研究进展|顶刊速递·24-08-13

小罗碎碎念 文献日推主题&#xff1a;人工智能在肿瘤亚型分类领域的研究进展 昨天晚上在研究鼻咽癌的病理学诊断指南&#xff0c;看到了下面这段话的时候&#xff0c;我问了自己一个问题——通过AI识别出肿瘤亚型的根本目的是什么&#xff1f;可以衔接哪些具体的下游任务&#…...

Taro+Vue 创建微信小程序

TaroVue 创建微信小程序 一、全局安装 tarojs/cli二、项目初始化三、现在去启动项目吧 一、全局安装 tarojs/cli npm install -g tarojs/cli //安装 npm info tarojs/cli //查看安装信息 如果正常显示版本说明成功了&#xff0c;就直接跳到第二步吧官网说&#xff1a;…...

智能安全守护,寺庙安全用电解决方案

在四川省蓬溪县城北&#xff0c;高峰山以其千年的历史沉淀和独特的文化风貌&#xff0c;默默诉说着道教与佛教交融的传奇。然而&#xff0c;2017年5月31日凌晨的一声巨响&#xff0c;打破了这里的宁静&#xff0c;一场突如其来的大火&#xff0c;让这座承载着无数信徒信仰与梦想…...

加热系统加入达温即停和保温功能

加热系统加入达温即停和保温功能 引言 ​ 我们前一节, 是通过控制io口, 直接控制加热的开关, 但是这太简单粗暴了, 如果只是那样, 和普通的家居电器,是没区别的, 我们想要更智能一点, 就是像咱们自己家的热水壶那样, 水烧滚了(水温达到100摄氏度), 就自动停止了. 加热功能&a…...

C++_2_ inline内联函数 宏函数(2/3)

C推出了inline关键字&#xff0c;其目的是为了替代C语言中的宏函数。 我们先来回顾宏函数&#xff1a; 宏函数 现有个需求&#xff1a;要求你写一个Add(x,y)的宏函数。 正确的写法有一种&#xff0c;错误的写法倒是五花八门&#xff0c;我们先来“见不贤而自省也。” // …...

ROS执行多个节点报错(遥控运动及SLAM建图)

今天在实体机器人中同时执行多个ROS节点: roslaunch rei_robot_base oryxbot_base.launchroslaunch robot_joy robot_joy.launchroslaunch oryxbot_slam oryxbot_slam_local.launch结果全部报错退出了 现在换一种执行方式: roscoreroslaunch rei_robot_base oryxbot_base.la…...

Spring Boot项目中实现文件的上传、下载和预览功能

在Spring Boot项目中实现文件的上传、下载和预览功能&#xff0c;可以通过使用Spring MVC的MultipartFile接口来处理文件上传&#xff0c;并使用HttpServletResponse或Resource来实现文件下载和预览。下面是如何实现这些功能的完整示例。 1. 引入依赖 确保在pom.xml中引入了S…...

【JAVA入门】Day21 - 时间类

【JAVA入门】Day21 - 时间类 文章目录 【JAVA入门】Day21 - 时间类一、JDK7前的时间相关类1.1 Date1.2 SimpleDateFormat1.3 Calendar 二、JDK8新增的时间相关类2.1 Date 相关类2.1.1 ZoneId 时区2.1.2 Instant 时间戳2.1.3 ZoneDateTime 带时区的时间 2.2 DateTimeFormat 相关…...

SQL server数据库备份和还原

新手小白都懂的sql server数据库备份和还原 一、备份 1.打开sql server数据库找到 2.展开找到对应的数据库文件 鼠标右击—任务–备份 3.复制名称 4.复制完点击添加 5.点击添加完之后再次点击查找路径 6.分别两个路径 原路径和新路径 &#xff08;新路径是找到原路径新建了一…...

B站搜索建库架构优化实践

前言 搜索是B站的重要基础功能&#xff0c;需要对包括视频、评论、图文等海量的站内优质资源建立索引&#xff0c;处理来自用户每日数亿的检索请求。离线索引数据的正确、高效产出是搜索业务的基础。我们在这里分享搜索离线架构整体的改造实践&#xff1a;从周期长&#xff0c;…...

XSS反射实战

目录 1.XSS向量编码 2.xss靶场训练&#xff08;easy&#xff09; 2.1第一关 2.2第二关 方法一 方法二 2.3第三关 2.4第四关 2.5第五关 2.6第六关 2.7第七关 第一种方法&#xff1a; 第二种方法&#xff1a; 第三个方法&#xff1a; 2.8第八关 1.XSS向量编码 &…...

远程消息传递的艺术:NSDistantObject在Objective-C中的妙用

标题&#xff1a;远程消息传递的艺术&#xff1a;NSDistantObject在Objective-C中的妙用 引言 在Objective-C的丰富生态中&#xff0c;NSDistantObject扮演着至关重要的角色&#xff0c;特别是在处理分布式系统中的远程消息传递。它允许对象之间跨越不同地址空间进行通信&…...

指向派生类的基类指针、强转为 void* 再转为基类指针、此时调用虚函数会发生什么?

指向派生类的基类指针、强转为 void* 再转为基类指针、此时调用虚函数会发生什么&#xff1f; 1、无论指针类型怎么转&#xff0c;类对象内存没有发生任何变化&#xff0c;还是vfptr指向虚函数表&#xff0c;下面是成员变量&#xff0c;这在编译阶段就已经确定好了&#xff1b…...

操作系统(Linux实战)-进程创建、同步与锁、通信、调度算法-学习笔记

1. 进程的基础概念 1.1 进程是什么&#xff1f; 定义&#xff1a; 进程是操作系统管理的一个程序实例。它包含程序代码及其当前活动的状态。每个进程有自己的内存地址空间&#xff0c;拥有独立的栈、堆、全局变量等。操作系统通过进程来分配资源&#xff08;如 CPU 时间、内…...

react的setState中为什么不能用++?

背景&#xff1a; 在使用react的过程中产生了一些困惑&#xff0c;handleClick函数的功能是记录点击次数&#xff0c;handleClick函数被绑定到按钮中&#xff0c;每点击一次将通过this.state.counter将累计的点击次数显示在页面上 困惑&#xff1a; 为什么不能直接写prevStat…...

2.2算法的时间复杂度与空间复杂度——经典OJ

本博客的OJ标题均已插入超链接&#xff0c;点击可直接跳转~ 一、消失的数字 1、题目描述 数组nums包含从0到n的所有整数&#xff0c;但其中缺了一个。请编写代码找出那个缺失的整数。你有办法在O(n)时间内完成吗&#xff1f; 2、题目分析 &#xff08;1&#xff09;numsS…...

【CentOS 】DHCP 更改为静态 IP 地址并且遇到无法联网

文章目录 引言解决方式标题1. **编辑网络配置文件**&#xff1a;标题2. **确保配置文件包含以下内容**&#xff1a;特别注意 标题3. **重启网络服务**&#xff1a;标题4. **检查配置是否生效**&#xff1a;标题5. **测试网络连接**&#xff1a;标题6. **检查路由表**&#xff1…...

Linux 操作系统 --- 信号

序言 在本篇内容中&#xff0c;将为大家介绍在操作系统中的一个重要的机制 — 信号。大家可能感到疑惑&#xff0c;好像我在使用 Linux 的过程中并没有接触过信号&#xff0c;这是啥呀&#xff1f;其实我们经常遇到过&#xff0c;当我们运行的进程当进程尝试访问非法内存地址时…...

黑马前端——days09_css

案例 1 页面框架文件 <!DOCTYPE html> <html lang"zh-CN"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><meta http-equiv"X-UA-Compati…...

【Python爬虫】技术深度探索与实践

目录 引言 第一部分&#xff1a;Python爬虫基础 1.1 网络基础 1.2 Python爬虫基本流程 第二部分&#xff1a;进阶技术 2.1 动态网页抓取 2.2 异步编程与并发 2.3 反爬虫机制与应对 第三部分&#xff1a;实践案例 第四部分&#xff1a;法律与道德考量 第五部分&#x…...

智启万象|挖掘广告变现潜力,保障支付安全便捷

谷歌致力于为开发者提供 先进的广告变现与支付解决方案 一起回顾 2024 Google 开发者大会 了解如何利用谷歌最新工具和功能 提高变现收入&#xff0c;优化用户体验&#xff0c;保障交易安全 让变现更上一层楼 广告检查器是谷歌 AdMob 平台最新推出的高级测试工具&#xff0c;开…...

函数递归,匿名、内置行数,模块和包,开发规范

一、递归与二分法 一&#xff09;递归 1、递归调用的定义 递归调用&#xff1a;在调用一个函数的过程中&#xff0c;直接或间接地调用了函数本身 2、递归分为两类&#xff1a;直接与间接 #直接 def func():print(from func)func()func() # 间接 def foo():print(from foo)bar…...

Springboot3 整合swagger

一、pom.xml <dependency><groupId>org.springdoc</groupId><artifactId>springdoc-openapi-starter-webmvc-api</artifactId><version>2.1.0</version></dependency> 二、application.yml # SpringDoc配置 # springdoc:swa…...

查看同一网段内所有设备的ip

使用命令提示符&#xff08;CMD&#xff09;进行扫描 查看本机IP地址 首先通过 ipconfig /all 命令查看本机的IP地址&#xff0c;确定你的网段&#xff0c;例如 192.168.1.。 Ping网段内每个IP地址 接着使用循环命令&#xff1a; for /L %i IN (1,1,254) DO ping -w 1 -n …...

Spark MLlib 特征工程(上)

文章目录 Spark MLlib 特征工程(上)特征工程预处理 Encoding:StringIndexer特征构建:VectorAssembler特征选择:ChiSqSelector归一化:MinMaxScaler模型训练总结Spark MLlib 特征工程(上) 前面我们一起构建了一个简单的线性回归模型,来预测美国爱荷华州的房价。从模型效果来…...

《SPSS零基础入门教程》学习笔记——03.变量的统计描述

文章目录 3.1 连续变量&#xff08;1&#xff09;集中趋势&#xff08;2&#xff09;离散趋势&#xff08;3&#xff09;分布特征 3.2 分类变量&#xff08;1&#xff09;单个分类变量&#xff08;2&#xff09;多个分类变量 3.1 连续变量 &#xff08;1&#xff09;集中趋势 …...

2024年杭州市网络与信息安全管理员(网络安全管理员)职业技能竞赛的通知

2024年杭州市网络与信息安全管理员&#xff08;网络安全管理员&#xff09;职业技能竞赛的通知 一、组织机构 本次竞赛由杭州市总工会牵头&#xff0c;杭州市人力资源和社会保障局联合主办&#xff0c;杭州市萧山区总工会承办&#xff0c;浙江省北大信息技术高等研究院协办。…...

SpringBoot参数校验详解

前言 在web开发时&#xff0c;对于请求参数&#xff0c;一般上都需要进行参数合法性校验的&#xff0c;原先的写法时一个个字段一个个去判断&#xff0c;这种方式太不通用了&#xff0c;Hibernate Validator 是 Bean Validation 规范的参考实现&#xff0c;用于在 Java 应用中…...

安全基础学习-SHA-1(Secure Hash Algorithm 1)算法

SHA-1(Secure Hash Algorithm 1)是一种密码学哈希函数,用于将任意长度的输入数据(消息)转换成一个固定长度的输出(哈希值或摘要),长度为160位(20字节)。SHA-1的主要用途包括数据完整性验证、数字签名、密码存储等。 1、SHA-1 的特性 定长输出:无论输入数据长度是多…...

leetcode350. 两个数组的交集 II,哈希表

leetcode350. 两个数组的交集 II 给你两个整数数组 nums1 和 nums2 &#xff0c;请你以数组形式返回两数组的交集。返回结果中每个元素出现的次数&#xff0c;应与元素在两个数组中都出现的次数一致&#xff08;如果出现次数不一致&#xff0c;则考虑取较小值&#xff09;。可…...

基于YOLOv8的缺陷检测任务模型训练

文章目录 一、引言二、环境说明三、缺陷检测任务模型训练详解3.1 PCB数据集3.1.1 数据集简介3.1.2 数据集下载3.1.3 构建yolo格式的数据集 3.2 基于ultralytics训练YOLOv83.2.1 安装依赖包3.2.2 ultralytics的训练规范说明3.2.3 创建训练配置文件3.2.4 下载预训练模型3.2.5 训练…...

【upload]-ini-[SUCTF 2019]CheckIn-笔记

上传图片木马文件后看到&#xff0c;检查的文件内容&#xff0c;包含<? 一句话木马提示 检查的文件格式 用如下图片木马&#xff0c;加上GIF89a绕过图片和<?检查 GIF89a <script languagephp>eval($_POST[cmd])</script> .user.ini实际上就是一个可以由用…...

uniapp条件编译使用教学(#ifdef、#ifndef)

#ifdef //仅在xxx平台使用#ifndef //除了在xxx平台使用#endif // 结束 标识平台APP-PLUSAPPMP微信小程序/支付宝小程序/百度小程序/头条小程序/QQ小程序MP-WEIXIN微信小程序MP-ALIPAY支付宝小程序MP-BAIDU百度小程序MP-TOUTIAO头条小程序MP-QQQQ小程序H5H5APP-PLUS-NVUEApp nv…...