1335:【例2-4】连通块

【算法分析】

       设数组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.hqwc.cn/news/541082.html

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

相关文章

C++ //练习 10.34 使用reverse_iterator逆序打印一个vector。

C Primer&#xff08;第5版&#xff09; 练习 10.34 练习 10.34 使用reverse_iterator逆序打印一个vector。 环境&#xff1a;Linux Ubuntu&#xff08;云服务器&#xff09; 工具&#xff1a;vim 代码块 /**************************************************************…

湖北省建筑安全员C证考试通过后,如何在各平台快速查询

湖北省建筑安全员C证考试通过后&#xff0c;如何在各平台快速查询&#xff1f; 2024年湖北省建筑安全员C证&#xff08;建安C&#xff09;证书查询 蛮多人考过建筑安全员C证不知道在哪里查询&#xff0c;建筑行业的安全员C证也称之为专职安全员&#xff0c;建筑安全员ABC /三…

TCP的三次握手和4次挥手

一、首先讲一下TCP的由来 最开始&#xff0c;人们考虑到将网络信息的呼唤与回应进行规范&#xff0c;达成一种公认的协议&#xff0c;就好像没有交通规则的路口设定交通规则。 人们设计出完美的OSI协议&#xff0c;这个协议包含七个层次由下到上分别是&#xff1a; 物理层&…

RuoYi-Vue使用RestTemplate无法通过@Autowired注入报错

A component required a bean of type org.springframework.web.client.RestTemplate that could not be found. 解决方法&#xff1a; 将ruoyi-framework模块下找到ApplicationConfig这个配置类使用Bean注入&#xff1a; /*** RestTemplate配置*/Beanpublic RestTemplate r…

Linux信号灯

概念&#xff1a;是不同进程间或一个给定进程内部不同线程间同步的机制。类似我们的 PV操作概念&#xff1a; 生产者和消费者场景 &#xff30;(&#xff33;) 含义如下:if (信号量的值大于0) { 申请资源的任务继续运行&#xff1b;信号量的值减一&#xff1b;} else { 申…

防范服务器被攻击:查询IP地址的重要性与方法

在当今数字化时代&#xff0c;服务器扮演着重要的角色&#xff0c;为企业、组织和个人提供各种网络服务。然而&#xff0c;服务器也成为了网络攻击者的目标之一&#xff0c;可能面临各种安全威胁&#xff0c;例如DDoS攻击、恶意软件攻击、数据泄露等。为了有效地防范服务器被攻…

matplotlib-散点图

日期&#xff1a;2024.03.14 内容&#xff1a;将matplotlib的常用方法做一个记录&#xff0c;方便后续查找。 # 引入需要使用的库 from matplotlib import pyplot as plt# 设置画布大小 plt.figure(figsize(20,8),dpi 300)# 全局设置中文字体 plt.rcParams[font.sans-serif]…

项目性能优化—性能优化的指标、目标

项目性能优化—性能优化的指标、目标 性能优化的终极目标是什么 性能优化的目标实际上是为了更好的用户体验&#xff1a; 一般我们认为用户体验是下面的公式&#xff1a; 用户体验 产品设计&#xff08;非技术&#xff09; 系统性能 ≈ 系统性能 快 那什么样的体验叫快呢…

java复健-接口的开发及参数校验

遇到的问题以及解决方案 Q1. 开发接口的流程 A1&#xff1a; 明确需求阅读接口文档思路分析开发测试 Q2. 开发时用到的技术 A2&#xff1a; LomBok&#xff1a;Data&#xff0c;自动为我们的实体类创建构造方法&#xff0c;set&#xff08;&#xff09;&#xff0c;get&am…

探索仿函数(Functor):C++中的灵活函数对象

文章目录 一、仿函数定义及使用二、仿函数与函数指针的区别三、仿函数与算法的关系四、仿函数的实践用例 在C编程中&#xff0c;我们经常需要对数据进行排序、筛选或者其他操作。为了实现这些功能&#xff0c;C标准库提供了许多通用的算法和容器&#xff0c;而其中一个重要的概…

GPU性能测试中的张量和矩阵运算

正文共&#xff1a;888 字 7 图&#xff0c;预估阅读时间&#xff1a;1 分钟 前面我们使用PyTorch将Tesla M4跑起来之后&#xff08;成了&#xff01;Tesla M4Windows 10AnacondaCUDA 11.8cuDNNPython 3.11&#xff09;&#xff0c;一直有个问题&#xff0c;那就是显存容量的问…

“CT每多做一次,患癌风险就增加43%”冲上热搜,CT到底还能不能做?

多家媒体报道某专家称做一次 CT 患癌风险提高 43%&#xff0c;这个让很多朋友感到很恐慌&#xff0c;甚至拒绝 CT 和 X 线检查&#xff0c;那么这种说法到底有道理吗&#xff1f; 先说结论&#xff0c; 这其实是该话题在传播过程中省略了很多关键信息&#xff0c;结果造成了误…