1335:【例2-4】连通块

news2025/1/17 4:09:19

【算法分析】

       设数组vis,vis[i][j]表示(i,j)位置已经访问过。遍历地图中的每个位置,尝试从每个位置开始进行搜索。如果该位置不是0且没有访问过,那么访问该位置,并尝试从其上下左右四个位置开始搜索。在看一个新的位置时,如果该位置在地图内,没有访问过且不是0,那么继续从该位置开始进行搜索。在遍历网格的过程中,一次成功开始的搜索可以确定一个连通块,统计连通块的个数,即为结果。 


现在我们以样例为例模拟出这个方格图的搜索顺序:    
①将(1,1)加入队列,(1,1)表示左上角这个格子,当前队列为:{(1,1)},联通块加1,等于1。    
②取出队首的(1,1),标记为已搜索并对其进行四连通扩展,扩展出(1,2),删除(1,1),队列变为:{(1,2)}。    
③取出队首的(1,2),标记为已搜索并对其进行四连通扩展,扩展到了(1,1),(1,3),(2,2),(1,1)已经被标记搜索过,所以只将(1,3),(2,2)加入队列,删除队首(1,2),队列变为:{(1,3),(2,2)}。    
④取出队首的(1,3),没有扩展出新格子,删除队首队列变为:{(2,2)}    
⑤取出队首的(2,2),没有扩展出新格子,队列变为{}。完成以(1,1)开始的搜索。    
⑥将(3,1)加入队列,队列变为:{(3,1)},联通块数加1变为2。    
⑦取出队首的(3,1),没有扩展出新格子,删除队首队列变为{}。完成以(3,1)开始的搜索。    
⑧将(3,3)加入队列,队列变为:{(3,3)},联通块数加1变为3。    
⑨取出队首的(3,3),没有扩展出新格子,删除队首队列变为{}。完成以(3,3)开始的搜索。无法再加入新的元素,程序结束。
搜索方法可以采用深搜或广搜。

广搜代码

#include<bits/stdc++.h>
using namespace std;
#define N 105
struct Node
{
	int x, y;
	Node(){}
	Node(int a, int b):x(a),y(b){}
};
int n, m, a[N][N], ans;//ans:连通块个数
bool vis[N][N];//vis[i][j]:(i,j)是否访问过 
int dir[4][2] = {{0, 1}, {0, -1}, {1, 0}, {-1, 0}};
void bfs(int sx, int sy)
{
	queue<Node> que;
	vis[sx][sy] = true;
	que.push(Node(sx,sy));
	while(que.empty() == false)
	{
		Node u = que.front();
		que.pop();
		for(int i = 0; i < 4; ++i)
		{
			int x = u.x + dir[i][0], y = u.y + dir[i][1];
			if(x >= 1 && x <= n && y >= 1 && y <= m && vis[x][y] == false && a[x][y] == 1)
			{
				vis[x][y] = true;
				que.push(Node(x,y));
			}
		}
	}
}
int main()
{
	cin >> n >> m;
	for(int i = 1; i <= n; ++i)
		for(int j = 1; j <= m; ++j)
			cin >> a[i][j];
	for(int i = 1; i <= n; ++i)
		for(int j = 1; j <= m; ++j)
		{
			if(a[i][j] == 1 && vis[i][j] == false)//如果这里是黑色的且没访问过 
			{
				bfs(i, j);
				ans++;//每次成功进行广搜可以确定一个连通块 
			}
		}
	cout << ans;
	return 0;
}

解析:
struct Node {    
int x, y;    
Node(){}    
Node(int a, int b):x(a),y(b){}
};

这是一个 C++ 中的结构体定义。该结构体名为 Node,包含两个成员变量 x 和 y,均为整型。同时定义了两个构造函数,一个是默认构造函数,一个是带两个参数的构造函数,用于初始化 x 和 y。可以在程序中使用 Node 类型来创建变量。例如:Node n(1, 2); // 创建一个 Node 变量 n,其 x 值为 1,y 值为 2

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

网络机顶盒什么牌子好?小编盘点零差评网络机顶盒排行榜

在挑选网络机顶盒的时候我们往往会参考销量和口碑&#xff0c;小编花费一个月时间整理了热门网络机顶盒的用户评价情况&#xff0c;整理了这份口碑最好的网络机顶盒排行榜&#xff0c;跟着我一起看看网络机顶盒什么牌子好吧。 NO.1、泰捷WEBOX WE40S网络机顶盒 在混迹网络机顶…

Linux下的多线程编程:原理、工具及应用(1)

&#x1f3ac;慕斯主页&#xff1a;修仙—别有洞天 ♈️今日夜电波&#xff1a;Flower of Life—陽花 0:34━━━━━━️&#x1f49f;──────── 4:46 &#x1f504; ◀️ ⏸ ▶️ ☰ …

浅谈估值模型:从估值-收益分布看待市场投资价值

摘要及声明 1&#xff1a;本文从估值的角度&#xff0c;通过深入研究指数估值变化的特征&#xff0c;总结出市场几轮牛熊背后的规律&#xff0c;从而客观理性地判断目前市场的投资价值。技术方面&#xff0c;本文通过ipywidgets交互式控件实现数据的可视化和交互式展示。 2&a…

Git 学习笔记 三个区域、文件状态、分支、常用命令

Git 学习 GitGit概念VS Code中使用仓库&#xff08;repository&#xff09;示例 Git 使用时的三个区域示例 Git 文件状态示例 Git 暂存区示例 Git 回退版本删除文件忽略文件示例 分支分支的使用分支的合并与删除分支的合并冲突 Git常用命令Git远程仓库 (HTTP)步骤远程仓库 克隆…

游戏开发需不需要考研?

近年来&#xff0c;中国游戏行业增速放缓&#xff0c;用户基数趋于饱和&#xff0c;行业监管日趋严格&#xff0c;国外竞争激烈&#xff0c;使游戏公司面临挑战。为适应形势&#xff0c;游戏企业正在调整策略&#xff0c;采取主动学习和实战练习的方式&#xff0c;提升游戏质量…

虚拟环境的激活

(此博客仅用于我记录虚拟环境的激活方法) 虚拟环境的激活命令: venv/Scripts/activate 在F:\git repo\Database-Course-Design 这个文件夹中启动命令行 这个文件夹中含有虚拟环境venv 输入命令venv/Scripts/activate&#xff0c;就得到下面的结果: 此时就激活了虚拟环境&…

AVCE - AV Evasion Craft Online 更新 8 种加载方式 - 过 WD 等

免责声明&#xff1a;本工具仅供安全研究和教学目的使用&#xff0c;用户须自行承担因使用该工具而引起的一切法律及相关责任。作者概不对任何法律责任承担责任&#xff0c;且保留随时中止、修改或终止本工具的权利。使用者应当遵循当地法律法规&#xff0c;并理解并同意本声明…

3. ElasticSearch搜索技术深入与聚合查询实战

1. ES分词器详解 1.1 基本概念 分词器官方称之为文本分析器&#xff0c;顾名思义&#xff0c;是对文本进行分析处理的一种手段&#xff0c;基本处理逻辑为按照预先制定的分词规则&#xff0c;把原始文档分割成若干更小粒度的词项&#xff0c;粒度大小取决于分词器规则。 1.2 …

[SWPUCTF 2021 新生赛]crypto6

题目&#xff1a; 从代码可以看出​​​​​​该题目对flag依次进行了base64,base32,base16加密。要得到正确的flag即进行相反的操作&#xff0c;即依次进行base16,32,64的解码即可

dp求公共子序列

#include<iostream> using namespace std; int main(){string a1,a2;while(cin>>a1>>a2){int data[201][201]{};// 每次的最长记录for(int i1;i<a1.size();i){for(int j1;j<a2.size();j){if(a1[i-1] a2[j-1]){// 相等在2个字母未加进之前长度1data[i]…

MOS管、IGBT的区别

MOS管&#xff0c;即Metal-Oxide-Semiconductor Field-Effect Transistor&#xff0c;是我们常见的一种半导体器件&#xff0c;也被广泛称为MOSFET。 这种器件的工作原理独特且高效&#xff0c;主要是通过控制栅极电压来调控电流在两个源极和漏极之间的流动&#xff0c;这也是其…

使用LLMs大模型进行股票投资预测——能实现盈利还能自我反思并给出合理解释

前言 股市的变化难以预测&#xff0c;任何微小的变化都可能对股票走势产生影响&#xff0c;这种不确定性让投资者们感到困惑。因此&#xff0c;研究者们开始关注目前备受关注的大型模型技术&#xff0c;他们试图利用这些技术来高效地处理和分析大量的股市数据&#xff0c;从中…

c++基础语法—————默认成员函数

文章目录 一、构造函数&#xff08;初始化&#xff09;1.构造函数的名称与类名相同&#xff0c;没有返回类型&#xff0c;可以有参数。2.对象实例化时&#xff0c;编译器自动调用构造函数进行初始化3.若类中没有显示定义一个用户的构造函数&#xff0c;编译器则会自动生成一个默…

[LVGL]:MACOS下使用LVGL模拟器

如何在MACOS下使用lvgl模拟器 1.安装必要环境 brew install sdl2查看sdl2安装位置&#xff1a; (base) ➜ ~ brew list sdl2 /opt/homebrew/Cellar/sdl2/2.30.1/bin/sdl2-config /opt/homebrew/Cellar/sdl2/2.30.1/include/SDL2/ (78 files) /opt/homebrew/Cellar/sdl2/2.3…

计算机系统·浮点数

浮点数 理解含有小数值的二进制数 定点表示方法 十进制&#xff1a;以小数点为分界线&#xff0c;小数点左边数字的权重是10的正幂&#xff0c;小数点右边数字的权重是10的负幂。如图所示 二进制&#xff1a;小数点左边数字的权重是2的正幂&#xff0c;小数点右边数字的权重…

免费阅读篇 | 芒果YOLOv8改进111:注意力机制CBAM:轻量级卷积块注意力模块,无缝集成到任何CNN架构中,开销可以忽略不计

&#x1f4a1;&#x1f680;&#x1f680;&#x1f680;本博客 改进源代码改进 适用于 YOLOv8 按步骤操作运行改进后的代码即可 该专栏完整目录链接&#xff1a; 芒果YOLOv8深度改进教程 该篇博客为免费阅读内容&#xff0c;YOLOv8CBAM改进内容&#x1f680;&#x1f680;&am…

Exam in MAC [容斥]

题意 思路 正难则反 反过来需要考虑的是&#xff1a; (1) 所有满条件一的(x,y)有多少对&#xff1a; x 0 时&#xff0c;有c1对 x 1 时&#xff0c;有c对 ...... x c 时&#xff0c;有1对 以此类推 一共有 (c2)(c1)/2 对 (2) 符合 x y ∈ S的有多少对&#xff1a…

深度学习每周学习总结P1(pytorch手写数字识别)

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 | 接辅导、项目定制 目录 0. 总结1. 数据导入部分2. 模型构建部分3. 训练前的准备4. 定义训练函数5. 定义测试函数6. 训练过程 0. 总结 总结: 数据导入部分&a…

Jmeter进行http接口测试

&#x1f345; 视频学习&#xff1a;文末有免费的配套视频可观看 &#x1f345; 关注公众号【互联网杂货铺】&#xff0c;回复 1 &#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 本文主要针对http接口进行测试&#xff0c;使用 jmeter工具实现…

Jenkins自定义镜像推送到Harbor仓库

之前Jenkins需要推送jar包到远程到目标服务器再进行构建 现在Jenkins容器内部可以直接使用Docker了 直接在Jenkins构建好推送到Harbor仓库上&#xff0c;然后不管是哪台目标服务器&#xff0c;只需要去Harbor仓库拉取镜像即可。 修改Jenkins任务 将代码检测下面的远程服务器步…