bfs算法

红与黑 C++搜索例题 题目描述: 有一个矩形房间,覆盖正方形瓷砖。每块瓷砖涂成了红色或黑色。一名男子站在黑色的瓷砖上,由此出发,可以移到四个相邻瓷砖之一,但他不能移动到红砖上,只能移动到黑砖上。编写一个程序,计算他通过重复上述移动所能经过的黑砖数(一开始站立的黑砖也要算)。 输入: 开头行包含两个正整数W和H,W和H分别表示矩形房间的列数和行数,且都不超过20. 每个数据集有H行,其中每行包含W个字符。每个字符的含义如下所示: ‘.’——黑砖 ‘#’——红砖 ‘@’——男子(仅出现一次) 输出: 程序应该输出一行,包含男子从初始 阅读详情

bfs从原理上来讲就是在初始状态把所有可行的操作一一进行操作,通过不断的尝试找到目标状态,举个例子就好比在一个水池中扔入一颗石子会溅起水波水波不断地向各个空间移动最终到达目的状态,又好比走迷宫一般在每一个节点把上下左右都尝试一遍之后找到出口 因为bfs需要不断地储存状态,取出之前存放状态,进行操作,再次储存,我们不难想到用队来进行储存;

例题如下

 1312 “Red and Black”
一个长方形的房间,铺着方形瓷砖,瓷砖为红色或黑色。一个人站在黑色瓷砖上,他可以按上、下、左、右方向移动到相邻的瓷砖。但他不能在红色瓷砖上移动,只能在黑色瓷砖上移动。编程计算他可以到达的黑色瓷砖的数量。
输入:第1行包含两个正整数W和H,W和H分别表示x方向和y方向上的瓷砖数量。W和H均不超过20。下面有H行,每行包含W个字符。每个字符表示一片瓷专的颜色。用符号表示如下:“。”表示黑色瓷砖;“#”表示红色瓷砖;“@”代表黑色瓷砖上的人,在数据集中只出现一次。
输出:一个数字,这个人从初始瓷砖能到达的瓷砖总数量(包括起点)。

(题目来源hduoj)

首先我们需要一个二维数组来储存初始各个转块的情况,再者我们需要储存横向个数和纵向格个数,再者我们需要一个结构体储存人的当前坐标

char room[23][23];
int Wx,hY;
struct node
{
    int x;
    int y;
};
int numb;//记录可走的砖块个数

其次我们需要对当前状态进行移动操作

int dir[4][2]={{1,0},{-1,0},{0,1},{0,-1}};//进行移动操作

再来因为一个状态我们需要四次移动尝试所以我们利用循环,然后再判断移动后的点是否是可行的

如果可行存入队中,同时我们需要两个结构体一个记录当前坐标一个记录移动后的坐标(start,next)

for(int i=0;i<4;i++)
{
next.x=start.x+dir[i][0];
next.y=start.y+dit[i][1];
if(next.x>=0&&next.x<Wx&&next.y>=0&&next.y<Hy&&room[next.x][next.y]=='.')//判断当前状态是否可行
{
numb++;
room[next.x][next.y]='#';//将走过的砖头改为#防止重复
q.push(next);
}//如果可行讲此状态入队,.改为#表示已经走过

 然后我们再从对列中取出一个元素进行操作即可

完整代码如下

#include<bits/stdc++.h>
using namespace std;
struct node
{
	int x;
	int y;
};
int Wx,Hy,num;
#define CHEACK(x,y)(x<Wx&&x>=0&&y<Hy&&y>=0)
char room[23][23];
int dior[4][2]={{0,1},{0,-1},{1,0},{-1,0}};
void bfs(int dx,int dy)
{
	num=1;
	queue<node>q;
	node start,next;
	start.x=dx;
	start.y=dy;
	q.push(start);
	while(!q.empty())
	{
		start=q.front();
		q.pop();
		cout<<"x="<<start.x<<"y="<<start.y<<endl;
		for(int i=0;i<4;i++)
		{
			next.x=start.x+dior[i][0];
			next.y=start.y+dior[i][1];
			if(CHEACK(next.x,next.y)&&room[next.x][next.y]=='.')
			{
				room[next.x][next.y]='#';
				q.push(next);
				num++;
			}
		}
	}
}
int main()
{
	cin>>Wx>>Hy;
	int dx,dy;
	for(int i=0;i<Wx;i++)
	{
		for(int j=0;j<Hy;j++)
		{
			cin>>room[i][j];
			if(room[i][j]=='@')
			{
				dx=i;
				dy=j;
			}
		}
	}
	bfs(dx,dy);
	cout<<num<<endl;
}

 

 

杭电oj 1312 Red and Black Red and Black 直接翻译了哈???? 问题描述 有一个长方形的房间,覆盖着方形瓷砖。每个磁贴的颜色为红色或黑色。一个人站在黑瓦上。从磁贴,他可以移动到四个相邻的磁贴之一。但他不能移动的红色瓷砖,他只能移动的黑色瓷砖。 编写一个程序来计算他可以通过重复上述移动可以达到的黑色瓷砖 的数量。 输入 输入由多个数据集组成。数据集以包含两个正整数 W 和 H 的行开头;W 和 H 分别是 x 方向和 y 方向中的切片数。W 和 H 不超过20。 数据集中有更多的 H 行,每个行都包含 W 字符。每个 阅读详情

相关推荐

BFS算法

BFS 博客的PDF点击此处下载 文章目录BFS什么是BFSBFS算法流程BFS算法流程举例伪代码c++代码参考时空复杂度分析BFS练习题单 什么是BFS BFS全称为Breadth First Search,中文名广度优先搜索或宽度优先搜索。 广度优先即按层去遍历整个图,一层访问结束后再去访问下一层。 算法过程可以看做是图上火苗传播的过程:最开始只有起点着火了,在每一时刻,有火的节点都向它相邻的所有节点传播火苗。 BFS算法流程 在标准的BFS中,所有的点被分为两种: 搜索过的 未搜索过的

qq_62213124的博客 2585

Python广度优先算法练习

1、题目一:xxxx 1.1 问题描述 一个矩形的房间铺着红色或者黑色的方砖。一个人站在红砖上不能移动,在黑砖上可以沿着上、下、左、右4个方向移动到相邻的方砖。请编写一个程序,计算从起点出发可以到达的黑色方砖的数量(包括起点在内)。 起点是@,要求:遍历所有黑砖。 1.2 输入格式 输入第一行是两个正整数W和H; W和H分别表示x方向和y方向上的方砖数量。W和H都是正整数并且不超过20. 接下来有H行,每行包含W个字符。每个字符表示方砖的颜色如下。 '.' - 黑砖 '#' -...

m0_48936146的博客 1575

BFS算法模板

BFS算法 BFS算法框架 BFS算法是利用队列实现的一种搜索算法。逐层向下遍历,从一个点像四周扩散(将可选节点存放于队列中,删除已被使用的节点),使用队列完成操作,通常用于最短路径的寻找。 单向队列 void BFS(Node root,int target) { // 1、两个队列,分别用于存储起始节点和已访问过的节点 queue<Node> q; unordered_set<Node> visited; // 2、将最初的起始

weixin_42477773的博客 3274

深搜剪枝之正方形

#include &lt;cstdio&gt; #include &lt;vector&gt; using namespace std; const int kMax = 20 + 5; const int kMaxEdge = 4; int n, sum; int p[kMax]; int len[kMaxEdge]; bool vis[kMax]; bool solve(int pos...

077CYW的博客 276

BFS算法框架详解

BFS算法框架详解 DFS就是回溯算法,BFS的核心思想就是把一些问题抽象成图,从一个点开始,向四周开始扩散。 BFS相对DFS最主要的区别是:BFS找到的路径一定是最短的,但代价就是空间复杂度比DFS大很多。 本文主要讲解两道BFS相关的题目,分别是【二叉树的最小高度】和【打开密码锁的最少步数】。 一.算法框架 BFS问题的本质是让你在一副图中**找到从起点start到终点target的最近距离**。 BFS的框架如下: //计算从起点start到终点target的最近距离 int BFS<Node

xunbaobao123的博客 2138

BFS算法可视化

本实验通过实现和可视化广度优先搜索(BFS)算法,深入理解其工作原理。实验构建了包含节点A-J的复杂图结构,采用队列数据结构实现BFS的逐层遍历特性。通过动态可视化展示,访问节点时高亮显示并设置延迟,直观呈现节点访问顺序。

yanyi_Jun的博客 1034

POJ1979_Red and Black(JAVA语言)

思路:bfs裸题。 对这种迷宫问题的bfs,我们把坐标点用一个class来存储,并放入队列进行求解。 //一直接收不了输入,找了一个多小时的问题,居然是行和列搞反了ORZ Red and Black Time Limit:1000MS Memory Limit:30000K Total Submissions:48833 Accepted:260...

老张的博客 2840

BFS算法介绍

定义: 广度优先算法(Breadth-First-Search),简称BFS,是一种图形搜索演算法。简单的说,BFS是从根节点开始,沿着树的宽度遍历树的节点,如果发现目标,则演算终止。 算法分析: BFS是一种盲目搜寻法,目的是系统地展开并检查图中的所有节点,以找寻结果。换句话说,它并不考虑结果的可能位置,彻底地搜索整张图,直到找到结果为止。 时间复杂度:O(|V| +

Geecky的博客 1万+

BFS算法简介

一、算法简介 广度优先算法(Breadth-First-Search),简称BFS。从知识点看属于图结构的搜索算法,是一种相对容易理解的简单算法。 BFS算法从问题的初始状态(起点)出发,根据状态转换规则(图结构中的边),遍历所有可能的状态(其他节点),直到找到终结状态(终点)。因此BFS算法的复杂度和状态集合的总数密切相关。 BFS算法虽然出自图结构,但其常用的领域却不是解决图论相关问题。一些常见的问题形式如(1)走迷宫最短路径(2)数字按规则转换的最少...

sigd的博客 2万+

告别蓝牙音质妥协:用ESP32和PCM5102搭建WiFi无损音频播放器(附完整代码)

本文详细介绍了如何利用ESP32微控制器和PCM5102 DAC芯片构建一套完整的WiFi无损音频流媒体系统,彻底摆脱蓝牙协议的音质束缚。从硬件原理到软件实现,包括核心器件选型、电路设计、I2S音频驱动实现以及系统优化方案,帮助音频发烧友实现高保真无线音频传输。

weixin_30733003的博客 542

基于Labview2012实现的双通道信号源(课程设计)

双通道信号源,产生8种波形,能进行调制,带信号幅度与频率扫描功能,波形可存储与导入

qq_40617082的博客 1461

BFS算法入门

      BFS:就是宽度优先搜索,他是搜索算法的一种,他是怎么搜索的呢?先这样说吧:假如在你是一个高度近视的人,在路上走着的时候一不小心,眼睛掉了,那么此时你会怎么办?很简单啊,赶紧蹲下来摸自己的眼睛啊,但是此时的你是看不见的,因为你高度近视,所以你便会蹲下来,用自己的手开始去摸地,去寻找自己的眼睛,下面我们就谈谈找眼睛这个事情,你会怎么在地上用你的双手去摸自己的眼睛呢?很简单啊,先从自己身边...

qq_42757965的博客 1952

超过4.2万个AOI(地理围栏),深圳市2025年2月15日更新的全类别AOI,矢量图层(全国22个超大特大城市AOI更新系列)

超过4.2万个AOI(地理围栏),深圳市2025年2月15日更新的全类别AOI,矢量图层(全国22个超大特大城市AOI更新系列)

1071

算法进阶之BFS 算法

BFS 算法 BFS 的核心思想应该不难理解的,就是把一些问题抽象成图,从一个点开始,向四周开始扩散。一般来说,我们写 BFS 算法都是用「队列」这种数据结构,每次将一个节点周围的所有节点加入队列。 BFS 相对 DFS 的最主要的区别是:BFS 找到的路径一定是最短的,但代价就是空间复杂度比 DFS 大很多. BFS 出现的常见场景就是让你在一幅「图」中找到从起点 start 到终点 target 的最近距离. 这个广义的描述可以有各种变体,比如走迷宫,有的格子是围墙不能走,从起点到终点的最短距离是多少?

AndyJ的学习之旅 1831

针对so层不固定位置的动态加密,怎么解决?(面试题)

Android逆向之破解某应用加密算法(动态调试so和hook so代码):so 代码动态解密后才执行,我们可以在解密完成后获取解密后的代码或数据。Android逆向之旅—动态方式破解apk进阶篇(IDA调试so源码)如果你有更具体的加密场景,欢迎提供更多信息,我可以给出更详细的方案!某些 so 在运行时生成密钥,解密后再用。某APP密码加密算法分析。

SXXYNHHXX的博客 925

STC32G电调调试血泪史:从TPH1R403NL MOS管烧毁到PWM信号异常排查全记录

本文详细记录了STC32G无刷电调调试过程中的常见问题与解决方案,包括MOS管烧毁、PWM信号异常等关键故障排查。通过电源系统检测、驱动电路验证及三相平衡调试等实战经验,帮助硬件爱好者快速定位问题,提升电调调试效率。特别针对TPH1R403NL等MOS管的保护措施进行了重点分析。

weixin_33736048的博客 551

搜索算法——双向bfs

双向bfs适用于知道起点和终点的状态下使用,从起点和终点两个方向开始进行搜索,可以非常大的提高单个bfs的搜索效率 同样,实现也是通过队列的方式,可以设置两个队列,一个队列保存从起点开始搜索的状态,另一个队列用来保存从终点开始搜索的状态,如果某一个状态下出现相交的情况,那么就出现了答案 例题1:走迷宫 问题描述: 一个迷宫由RRR行CCC列格子组成,有的格子里有障碍物,不能走;有的格子是空地...

Psychosocial的博客 1万+

VTK API 详解(103):vtkGPUVolumeRayCastMapper - GPU加速体绘制

是 VTK 中基于 GPU 的高效体绘制映射器,利用现代显卡的计算能力,通过射线投射算法实现快速且高质量的三维体积渲染。相比 CPU 版本的,GPU 映射器性能大幅提升,支持更复杂的光照和渲染效果,是体绘制的主流选择。是 VTK 中性能优异的GPU体绘制映射器;适合大数据集和实时交互应用;配合灵活设置颜色、透明度和光照;建议在支持OpenGL的环境中使用。

yumeiguo的博客 295

优选算法——BFS

💁‍♂️👇。

2501_93697341的博客 1153

解决Windows 11文件右键菜单卡死问题的方法

当你右键点击一个文件或者文件夹时,系统会加载与该文件类型相关的上下文菜单项,如果其中某个菜单项的代码执行时间过长或者出现错误,就会导致整个右键菜单卡死。综上所述,当你在Windows 11中遇到右键菜单卡死的问题时,你可以尝试禁用上下文菜单项、重置文件关联、排除第三方软件干扰、修复系统文件以及优化代码等方法来解决问题。如果你是一个开发者,并且你自己编写了一个上下文菜单项,那么问题可能出在你的代码中。例如,如果你遇到了图片文件的右键菜单卡死问题,你可以找到".jpg"或".png"等相关的子项。

HnrzLinux的博客 7536

在Simulink中构建永磁同步电机的网络化控制模型,并分析通信网络对系统性能的影响

核心优势通过仿真验证了网络延迟和丢包对PMSM控制性能的影响。提供了改进PI参数或引入自适应控制的解决方案。扩展方向抗干扰控制:结合卡尔曼滤波或滑模控制抑制网络噪声。时间敏感网络(TSN)建模:参考知识库[2]的中断触发方式,实现确定性通信。网络安全仿真:模拟恶意攻击(如数据篡改)对控制系统的威胁。

xiaoheshang_123的博客 168

算法——BFS算法

BFS(广度优先搜索,Breadth-First Search)算法是一种用于图和树等数据结构中进行搜索的基本算法。它从指定的起始节点开始,逐层地向外扩展搜索,直到找到目标节点或遍历完整个图。BFS算法的基本思想是:先访问起始节点,然后依次访问起始节点的邻居节点,再依次访问邻居节点的邻居节点,以此类推,直到搜索到目标节点或者遍历完整个图。BFS算法使用队列来辅助实现节点的遍历顺序,保证每一层的节点按顺序访问。

qq_73201597的博客 1630

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

【基础算法总结】BFS_FloodFill算法

FloodFill(洪水灌溉) 算法介绍假设一个 4 * 4 的方格代表一块土地,土地上有些地方是凹陷的(假设用负数表示,-1,-2,-3……大小表示凹陷程度),有些地方是凸起的(假设用正数表示,1,2,3,4……大小表示凸起程度)。此时如果发洪水或是下雨,就会把凹陷的地方填满水,凸起的部分就会把凹陷的部分包围,填满水的区域会被连成一片一片的。所以这类问题要么是问有多少块填平的区域,要么是问最大的区域面积是多少,要么是问某一块区域的边长是多少。有些问题是规定只能上下左右联通,有些是斜对角也能联通。

2301_77900444的博客 2526

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

算法竞赛备赛——【搜索】BFS、双向BFS

BFS是广度优先搜索,第一次遇到的某个状态即为到这个状态的。BFS 最主要用途。:BFS比DFS快。注意:如果图中的边有权重,且不是所有边的权重都相同,那么不能用 BFS 来找最短路径,而要用其他算法,比如 Dijkstra 算法。广度优先搜索使用队列(queue)来实现,整个过程也可以看做一个倒立的树形:把根节点放到队列的末尾。每次从队列的头部取出一个元素,查看这个元素所有的下一级元素,把它们放到队列的末尾。并把这个元素记为它下一级元素的前驱。找到所要找的元素时结束程序。

2302_79975436的博客 2268
上一篇: 浅识c++中list的front,back,begin,end的区别
下一篇: 并查集算法
姐姐带你拿捏大厂算法
博客等级 码龄5年 17粉丝 19原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值