BFS 算法模板及使用

news/2025/3/21 6:22:28/文章来源:https://www.cnblogs.com/kkman2000/p/18784399

BFS 算法模板及使用

什么是 BFS 算法?

BFS (Breadth-First Search) 算法,中文全称广度优先搜索(宽度优先搜索), 区别于 DFS 算法一条路走到黑的本质, BFS 使用扩散性搜索。它将会根据规则一层一层向下搜索,容易发现,BFS 算法找到的路径一定是最短的,同时,它的时间复杂度较 DFS 而言短了不少,但代价就是空间复杂度比DFS大很多。图片

BFS 算法的模板长什么样?

queue<node> q;
void bfs(){while(!q.empty()){node temp=q.front();q.pop();if(完成目标){记录;return;}for(int i=0;i<m;i++)//m为方向数组长度{int xx=temp.x+dx[i];int yy=temp.y+dy[i];if(下标越界||已被标记){continue;}mark[xx][yy]=1;q.push(node{xx,yy});//注意,node{xx,yy}这种形式只适用于C++20及以上版本}}
}

BFS 算法适用于哪些问题?

BFS 算法的用途十分地广,可以解决迷宫问题,最短路问题等,以下是一些例题(这只是做例子使用,代码不做过多解释,请勿抄袭!

求细胞数量(P1451)

题目描述

一矩形阵列由数字 0 到 9 组成,数字 1 到 9 代表细胞,细胞的定义为沿细胞数字上下左右若还是细胞数字则为同一细胞,求给定矩形阵列的细胞个数。

输入格式

第一行两个整数代表矩阵大小 n 和 m。

接下来 n 行,每行一个长度为 m 的只含字符 0 到 9 的字符串,代表这个 n×m 的矩阵。

输出格式

一行一个整数代表细胞个数。

样例 #1

样例输入 #1
4 10
0234500067
1034560500
2045600671
0000000089
样例输出 #1
4

数据规模与约定

对于 100% 的数据,保证 1n,m100。

解法

此题需要每次都把发现的整个细胞做出标记:

#include<bits/stdc++.h>
using namespace std;
struct node{long long x,y;
};
long long m,n,sum;
queue<node>q;
string a[105];
int dx[10]={0,0,-1,1,0};
int dy[10]={0,1,0,0,-1};
void bfs(int x,int y)
{node te;te.x=x,te.y=y;q.push(te);while(!q.empty()){node temp=q.front();q.pop();a[temp.x][temp.y]='0';for(int i=1;i<5;i++){int xx=temp.x+dx[i];int yy=temp.y+dy[i];if(xx<1 || xx>n || yy<0 || yy>=m){continue;}if(a[xx][yy]=='0'){continue;}node t;t.x=xx;t.y=yy;q.push(t);}}
}
int main()
{cin>>n>>m;for(int i=1;i<=n;i++){cin>>a[i];}for(int i=1;i<=n;i++){for(int j=0;j<m;j++){if(a[i][j]!='0'){sum++;bfs(i,j);}}}cout<<sum;return 0;
}

做了一道橙题,做一道黄题试试手吧!

马的遍历(P1443)

题目描述

有一个 n×m 的棋盘,在某个点 (x,y) 上有一个马,要求你计算出马到达棋盘上任意一个点最少要走几步。

输入格式

输入只有一行四个整数,分别为 n,m,x,y。

输出格式

一个 n×m 的矩阵,代表马到达某个点最少要走几步(不能到达则输出 -1)。

样例 #1

样例输入 #1
3 3 1 1
样例输出 #1
0    3    2    
3    -1   1    
2    1    4

提示

数据规模与约定

对于全部的测试点,保证 1xn400,1ym400。

解法

#include<iostream>
#include<queue>
using namespace std;
struct node{long long x,y;
};
long long n,m,x,y,vis[405][405],mark[405][405],cnt=0;
int dx[10]={2,2,1,1,-1,-1,-2,-2};
int dy[10]={1,-1,2,-2,2,-2,1,-1};
queue<node> q;
void putit()
{for(int i=1;i<=n;i++){for(int j=1;j<=m;j++){cout<<mark[i][j]<<" ";}cout<<endl;}
}
void bfs()
{for(int i=1;i<=n;i++)for(int j=1;j<=m;j++)mark[i][j]=-1;q.push(node{x,y});mark[x][y]=0;while(!q.empty()){node temp=q.front();q.pop();for(int i=0;i<8;i++){long long xx=temp.x+dx[i],yy=temp.y+dy[i];if(xx>n || yy>m || xx<1 || yy<1 || mark[xx][yy]!=-1){continue;}q.push(node{xx,yy});mark[xx][yy]=mark[temp.x][temp.y]+1;}}
}
int main(void)
{cin>>n>>m>>x>>y;bfs();putit();return 0;} 

现在,你已经会使用 BFS 算法了,快去题库做题吧!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/902300.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ResNet-152 模型性能评估

ResNet-152 模型在渴望模式下的性能评估为了预热 GPU,在进行 20 次额外迭代以获取模型的平均推理时间之前,先运行 ResNet-152 模型 10 次。n_warmup = 10n_test = 20dtype = torch.bfloat16inference_time=[]mode=[]t_warmup, _ = timed(lambda:model(input_batch), n_warmup…

推荐专著1《AI芯片开发核心技术详解》、2《智能汽车传感器:原理设计应用》、3《TVM编译器原理与实践》、4《LLVM编译器原理与实践》

4本书推荐《AI芯片开发核心技术详解》、《智能汽车传感器:原理设计应用》、《TVM编译器原理与实践》、《LLVM编译器原理与实践》由清华大学出版社资深编辑赵佳霓老师策划编辑的新书《AI芯片开发核心技术详解》已经出版,京东、淘宝天猫、当当等网上,相应陆陆续续可以购买。该…

当巴别塔倒下。——从mygo到mujica

。序章 ???? 那时,天下人的口音,言语,都是一样。他们往东边迁移的时候,在示拿地遇见一片平原,就住在那里。他们彼此商量说,来吧,我们要作砖,把砖烧透了。他们就拿砖当石头,又拿石漆当灰泥。他们说,来吧,我们要建造一座城和一座塔,塔顶通天,为要传扬我们的名,…

一文速通Python并行计算:00 并行计算的基本概念

该文介绍了Python并行计算的核心概念、编程模型及其应用,并介绍了了并行程序的性能分析与优化方法,如并行效率、加速比及Amdahl定律。此外,该文介绍了共享内存、消息传递、数据并行和任务并行等并行编程模型,并提供Python环境配置指南。一文速通 Python 并行计算:00 并行计…

Pydantic配置继承抽象基类模式

title: Pydantic配置继承抽象基类模式 date: 2025/3/21 updated: 2025/3/21 author: cmdragon excerpt: Pydantic模型配置系统支持通过嵌套Config类定义字段校验、序列化等行为。配置继承需显式指定父类Config,子类可覆盖或扩展配置项。动态配置管理允许运行时通过工厂函数创…

Day19_java运算符_死锁

每日一题 题目 请解释死锁(Deadlock)的概念及其产生的必要条件,并说明常见的死锁处理策略及其优缺点。问题分析 此问题考察对操作系统资源管理机制的理解,需深入分析死锁的成因、判定条件及解决方法。回答时需结合理论模型与实际策略,体现系统性思维。参考答案 1. 死锁的定…

[AI/AIGC/GPT] 提示词工程1概述篇

概述:提示词工程提示工程(Prompt Engineering)是一门较新的学科,关注提示词开发和优化,帮助用户将大语言模型(Large Language Model, LLM)用于各场景和研究领域。 掌握了提示工程相关技能将有助于用户更好地了解大型语言模型的能力和局限性。 研究人员可利用提示工程来提…

java综合开发-前后端分离-01前端html,css

java综合开发-前后端分离-01前端html,css[ 任务列表 ] 1.阶段目标 2.网页基础知识 3.html和css 4.html的常用标签 4.1. 标题标签:h1-h6 4.2. 图片标签:img 4.3. 水平分割线标签:hr 4.4. css的三种引入方式: 4.5. 颜色的三种表示形式: 4.6. css的三种选择器: 4.7. 无语义…

Unreal最佳实践——通过进程Hack资源

Q:接到一个需求说是要一个外部C++调用ReadProcessMemory 黑进UE的程序找到uimage的地址,然后把里面的png图片拷贝出来,一头雾水 A:ReadProcessMemory写过 A:进程的启动地址就是你的基址,不过UE的需要找到world基址,所有的world对象U指针基于world,如果不是world内的,直接…

数据、信息、知识、智慧:AI时代我们该如何思考?

时代的浪潮滚滚向前,AI技术的演进正悄然改变着我们认知世界和创造价值的方式。从数据、信息到知识、智慧,从大数据到大模型,从单一智能体到多智能体协作,这是一场深刻的认知革命,也是生产力解放的新纪元。 AI粉嫩特攻队,2025年3月15日。 最近跟几个朋友讨论AI发展,突然意…

3.20学习苍穹外卖

今天主要学习关于微信支付的流程问题 又微信官方文档和流程图整体来说十分复杂 不过通过一篇博客成功跳过这个问题 引文正真支付是需要部分密钥文件 黑马不会提供这个 所有无法实现 就是通过直接跳转到成功支付实现的这个功能 https://blog.csdn.net/XZY__one/article/details/…

GKI改造原则、机制和方法

Google在android11-5.4分支上开始要求所有下游厂商使用Generic Kernel Image(GKI),需要将SoC和device相关的代码从核心内核剥离到可加载模块中(下文称之为GKI改造),从而解决内核碎片化问题。GKI为内核模块提供了稳定的内核模块接口(KMI),模块和内核可以独立更新。本文…