岛屿个数c++

参考文章
  1. 岛屿个数1
  2. 岛屿个数2
题目

输入样例:

2
5 5
01111
11001
10101
10001
11111
5 6
111111
100001
010101
100001
111111

输出样例:

1
3

样例解释

对于第一组数据,包含两个岛屿,下面用不同的数字进行了区分:

01111
11001
10201
10001
11111

岛屿 22 在岛屿 11 的 “环” 内部,所以岛屿 22 是岛屿 11 的子岛屿,答案为 11。

对于第二组数据,包含三个岛屿,下面用不同的数字进行了区分:

111111
100001
020301
100001
111111

注意岛屿 33 并不是岛屿 11 或者岛屿 22 的子岛屿,因为岛屿 11 和岛屿 22 中均没有“环”。

思路

遍历二维数组,遇到一块陆地‘1’,那么就把包含这块陆地的岛屿用bfs_islands函数搜索一遍,并标记这些块已经被搜索过了。然后,“派一些船”从该岛屿上一块陆地的八个方向出发,让船在海水上行驶,如果有船能到达“世界边缘”,那么说明该岛屿没有被包围。

最外层加一圈海水,这一圈海水即为世界边缘。

如果还是不太理解可以照着代码模拟一遍过程,就可以知道是如何得出答案的了。

代码
#include<bits/stdc++.h>
using namespace std;
typedef pair<int, int> PII;
const int N = 55;
//上右下左 左上 右上 右下 左下
int dx[] = {-1, 0, 1, 0, -1, -1, 1, 1}, dy[] = {0, 1, 0, -1, -1, 1, 1, -1};char a[N][N];
int n, m;
//st_il[][]判断某快陆地是否被遍历过;st_sw[][]判断某片海水是否被遍历过
bool st_il[N][N], st_sw[N][N];bool bfs_out(int x, int y)
{memset(st_sw, 0, sizeof(st_sw));//每次航海都要重置海水为:都没被遍历过queue<PII> q;q.push({x, y});st_sw[x][y] = true;while (q.size()){int t1 = q.front().first, t2 = q.front().second;q.pop();if(t1 <= 1 || t1 >= m || t2 <= 1 || t2 >= n)return true;for (int i = 0; i < 8; i ++){int tx = t1 + dx[i], ty = t2 + dy[i];if (tx >= 0 && tx <= m + 1 && t2 >= 0 && t2 <= n + 1 && !st_sw[tx][ty] && a[tx][ty] == '0'){st_sw[tx][ty] = true;q.push({tx, ty});}}}return false;
}void bfs_islands(int x, int y)
{queue<PII> q;q.push({x, y});st_il[x][y] = true;while (q.size()){int t1 = q.front().first, t2 = q.front().second;q.pop();for (int i = 0; i < 4; i ++){int tx = t1 + dx[i], ty = t2 + dy[i];if (tx >= 1 && tx <= m && ty >= 1 && ty <= n && !st_il[tx][ty] && a[tx][ty] == '1'){st_il[tx][ty] = true;q.push({tx, ty});}}}
}void solve()
{cin >> m >> n;for (int i = 1; i <= m; i ++)for (int j = 1; j <= n; j ++)cin >> a[i][j];int res = 0;    for (int i = 1; i <= m; i ++)for (int j = 1; j <= n; j ++){if (!st_il[i][j] && a[i][j] == '1'){bfs_islands(i, j);if (bfs_out(i, j)) res ++;}}cout << res << endl;memset(st_il, 0, sizeof(st_il));
}int main()
{int T;cin >> T;while (T --){solve();}return 0;
}

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

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

相关文章

Torch not compiled with CUDA enabled问题解决过程记录

1. 背景 运行大模型的时候&#xff0c;出现错误:Torch not compiled with CUDA enabled 原因&#xff1a;并不是电脑安装了nvdia显卡驱动就可以的&#xff0c;还需要安装 NVDIA GPU Computing Toolkit&#xff08;即CUDA Toolkit&#xff09;cudnn 另外还需要确保安装的pyt…

在Go语言中使用select和channel来期待确定性行为

Go开发人员在使用channel时常犯的一个错误是,对select在多个channel中的行为方式做出错误的假设。错误的假设可能会导致难以识别和重现的细微错误。假设我们要实现一个需要从两个channel接收消息的goroutine: 我们可能会决定像下面这样处理优先级: for {select {case v := &…

谷歌地图商家数据采集软件

谷歌地图商家数据采集软件是一款基于谷歌地图的数据采集工具&#xff0c;专为做外贸或商业分析的用户设计。以下是关于该软件的一些主要功能和特点&#xff1a; 广泛的数据采集能力&#xff1a;软件能够采集任意国家、任意地区的商家数据&#xff0c;包括公司地址、电话号码、…

ROS2 采集虚拟仿真环境图像并发布

简介&#xff1a;ROS2功能的学习我们还是在基于OpenAI的gym虚拟仿真环境中来完成&#xff0c;gym虚拟仿真环境安装请参考另一篇教程&#xff0c;这里不再重复说明&#xff0c;接下来我们开始创建一个ROS2的功能节点&#xff0c;并发布虚拟仿真环境小车摄像头的图像&#xff0c;…

day02 VS Code开发单片机

VS Code开发单片机 1.1 安装 MinGW-w64 1)MinGW-w64介绍 VS Code 用于编辑 C 代码,我们还需要 C 编译器来运行 C 代码,所以安装 VS Code之前我们需要先安装 C 编译器。这里我们使用 MinGW-w64(Minimalist GNU for Windows 64-bit)。 MinGW-w64 是一个用于Windows操作系…

SpringBoot和Vue2项目配置https协议

1、SpringBoot项目 ① 去你自己的云申请并下载好相关文件&#xff0c;SpringBoot下载的是Tomcat&#xff08;默认&#xff09;&#xff0c;Vue2下载的是Nginx ② 将下载的压缩包里面的.pfx后缀文件拷贝到项目的resources目录下 ③ 编辑配置文件 &#xff08;主要是框里面的内…

解决苹果iMac的M1芯片Node Sass does not yet support your current environment的问题

问题背景 如图所示&#xff0c;这是我的电脑&#xff0c;M1芯片 启动前端项目老是报错&#xff0c;说node Sass不支持我当前的环境&#xff0c;同事的macBook是intel芯片的&#xff0c;就能跑起项目来 很烦 但是不慌&#xff01;&#xff01;&#xff01; 咱有解决方法啦&a…

Git 自定义命令

前言 在使用 hexo 搭建个人博客时&#xff0c;共两种部署的方法。分别为&#xff1a; 本地利用 hexo 的插件 hexo-deployer-git 来实现部署&#xff0c;缺点是需要多敲几个命令行且不方便对源码进行云端备份使用 Github Action 的 workflow 自动化部署&#xff0c;优势就是可…

云原生__K8S

createrepo --update /var/localrepo/# 禁用 firewall 和 swap [rootmaster ~]# sed /swap/d -i /etc/fstab [rootmaster ~]# swapoff -a [rootmaster ~]# dnf remove -y firewalld-*[rootmaster ~]# vim /etc/hosts 192.168.1.30 harbor 192.168.1.50 master 192.168.1.…

数字货币:金融创新的未来?

随着科技的进步&#xff0c;数字货币作为一种新型的金融工具正逐渐走进人们的视线。那么&#xff0c;数字货币究竟是什么&#xff1f;它有哪些优势&#xff1f;它是否真的能够引领金融创新的未来&#xff1f;本文将从专业角度出发&#xff0c;深入探讨这些问题。 一、数字货币的…

HarmonyOs开发之———页签切换、组件状态管理

谢谢关注!! 前言:上一篇文章主要介绍HarmonyOs开发之———容器组件使用 http://t.csdnimg.cn/r9Qd1 一、Tabs组件页签切换 1、在HarmonyOS中,页签切换可以使用TabList组件来实现。 TabList允许你创建多个页签,并在切换时显示不同的内容。以下是一个页签切换的示例代码…

iOS 启动速度优化

启动耗时&#xff1a;点击App后到首帧显示耗费的时间。 阶段分析&#xff1a;premain、postmain&#xff0c;也就是main函数执行前和main函数执行后。 耗时检测&#xff1a;Instrument->App Launch Premain 减少动态库数量&#xff1a;启动时程序会加载动态库&#xff0c;…

web蓝桥杯真题:新鲜的蔬菜

代码&#xff1a; .box {display: flex; } #box1 {align-items: center;justify-content: center; }#box2 {justify-content: space-between; } #box2 .item:nth-child(2) {align-self: end; }#box3 {justify-content: space-between; } #box3 .item:nth-child(2) {align-self…

python + jdbc 连接 达梦数据库

依赖 jpype11.5.0jaydebeapi1.2.3DmJdbcDriver18.jar 启动JVM def start_jvm():jvm_path jpype.getDefaultJVMPath()jar_path ":".join([".....jar", # 需要python调用的其他jar包".../DmJdbcDriver18.jar" # 去达梦官网下载])Djava &qu…

富格林:注重虚假阻挠受骗亏损

富格林悉知&#xff0c;贵金属的投资热度&#xff0c;随着近年来愈发紧张的国际形势&#xff0c;而不断攀升&#xff0c;现如今不少投资者进入贵金属市场&#xff0c;但投资都会存在风险&#xff0c;在进行投资时需重视存在的虚假骗局阻挠受害亏损&#xff0c;同时学习正规做单…

SpringMVC项目入门

目录 1. 创建Maven项目 2. 设置项目结构 3.添加SpringMVC依赖 5. 创建控制器类 6. 配置 Deployment Descriptor 7. 运行项目 方法一&#xff1a;更新 Eclipse 插件 方法二&#xff1a;手动下载 XML Schema 文件 问题2&#xff1a; 1. 创建Maven项目 首先&#xff0c;打…

一分钟了解机器人自由度

目录 自由度的定义 自由度的分类 自由度的影响 影响自由度的主要参数 关节类型和数量 机械结构 控制系统 自由度控制的硬件架构原理 传感器 执行器 控制器 通信接口 软件和算法 机器人的自由度是指机器人在空间中可以独立移动的方向和角度的数量&#xff0c;它是衡…

QML Path 路径

作者: 一去、二三里 个人微信号: iwaleon 微信公众号: 高效程序员 在 QML 中,Path 是一种用于定义和描述路径的元素,通常需要和 Canvas、PathView、Shape 等元素结合一起使用,用于生成复杂的图形或动画效果。 所谓路径,是由一系列路径元素组成的集合,从起点开始,各段…

回滚远程仓库代码

开发过程中遇到合并到远程仓库代码有问题&#xff0c;急需保证线上正常运行&#xff0c;回滚成为唯一选项时&#xff0c;可以使用如下操作。 注意&#xff1a;最重要的一定要保证回滚操作前有备份&#xff0c;总之在做任何可能影响到数据的操作之前&#xff0c;确保你有备份或另…

jenkins参数化构建

Jenkins 的参数化构建 Jenkins 是一个开源的持续集成和持续部署工具&#xff0c;它可以帮助开发者自动化构建、测试和部署软件项目。在本文中&#xff0c;我们将重点介绍如何使用 Jenkins 的参数化构建功能来创建更加灵活和可定制的项目。 参数化构建是 Jenkins 提供的一种强…