第十四届蓝桥杯岛屿个数

题目描述
小蓝得到了一副大小为 M×N 的格子地图,可以将其视作一个只包含字符 0(代表海水)和 1(代表陆地)的二维数组,地图之外可以视作全部是海水,每个岛屿由在上/下/左/右四个方向上相邻的 1 相连接而形成。在岛屿 A 所占据的格子中,如果可以从中选出 k 个不同的格子,使得他们的坐标能够组成一个这样的排列:(x0,y0),(x1,y1),…,(xk−1,yk−1),其(x(i+1)%k,y(i+1)%k) 是由 (xi,yi) 通过上/下/左/右移动一次得来的 (0≤i≤k−1),此时这 k 个格子就构成了一个 “环”。如果另一个岛屿 B 所占据的格子全部位于这个 “环” 内部,此时我们将岛屿 B 视作是岛屿 A 的子岛屿。若 B 是 A 的子岛屿,C 又是 B 的子岛屿,那 C 也是 A 的子岛屿。请问这个地图上共有多少个岛屿?在进行统计时不需要统计子岛屿的数目。
输入格式
第一行一个整数 T,表示有 T 组测试数据。
接下来输入 T 组数据。
对于每组数据,第一行包含两个用空格分隔的整数 M、N 表示地图大小;接下来输入 M 行,每行包含 N 个字符,字符只可能是 0 或 1。

输出格式
对于每组数据,输出一行,包含一个整数表示答案。

数据范围
对于 30% 的评测用例,1≤M,N≤10。
对于 100% 的评测用例,1≤T≤10, 1≤M,N≤50 。
在这里插入图片描述
在这里插入图片描述
思路分析:
先从水里面开始八个方向来搜,如果搜到岛屿,就把岛屿扫一遍,如果一个岛屿a被其他岛屿围了起来,那么水肯定无法波及到它,思路就是这样,非常好想,只需要两步dfs就可以解决代码如下:
(需要注意的是本题要在地图最外层围上一层水,防止出现一开始上来技术岛屿导致水无法搜索)

#include<iostream>
#include<algorithm>
#include<cstring>
#include<string>
using namespace std;
int dx[] = { 1,0,-1,0 };
int dy[] = { 0,-1,0,1 };//上下左右
int dxx[] = { 0,1,0,-1,1,1,-1,-1 };
int dyy[] = { 1,0,-1,0,1,-1,1,-1 };//四面八方
bool st[55][55];//标记
int T, n, m, ans;
char g[55][55];
void ddfs(int x, int y)//扫陆地
{st[x][y] = 1;//标记for (int i = 0; i < 4; i++){int xx = x + dx[i], yy = y + dy[i];if (g[xx][yy] == '1' && xx >= 0 && yy >= 0 && xx <= n + 1 && yy <= m + 1 && !st[xx][yy]){ddfs(xx, yy);}}
}
void dfs(int x, int y)//海洋
{st[x][y] = 1;//标记for (int i = 0; i < 8; i++){int xx = x + dxx[i], yy = y + dyy[i];if (xx >= 0 && yy >= 0 && xx <= n + 1 && yy <= m + 1 && !st[xx][yy]){if (g[xx][yy] == '0') {dfs(xx, yy);}else {ddfs(xx, yy);ans++;}}}
}
int main()
{cin >> T;while (T--){ans = 0;//重置答案memset(st, 0, sizeof st);memset(g, '0', sizeof g);//重置标记和地图cin >> n >> m;for (int i = 1; i <= n; i++)for (int j = 1; j <= m; j++)cin >> g[i][j];dfs(0, 0);//从一开始搜索cout << ans << endl;}return 0;
}

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

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

相关文章

C++:类与对象(一)

hello&#xff0c;各位小伙伴&#xff0c;本篇文章跟大家一起学习《C&#xff1a;类与对象&#xff08;一&#xff09;》&#xff0c;感谢大家对我上一篇的支持&#xff0c;如有什么问题&#xff0c;还请多多指教 &#xff01; 文章目录 面向对象和面向过程的区别1.类的引入2.…

调用飞书获取用户Id接口成功,但是没有返回相应数据

原因&#xff1a; 该自建应用没有开放相应的数据权限。 解决办法&#xff1a; 在此处配置即可。

Codeforces Round 932 (Div. 2) ---- F. Andrey‘s Tree ---- 题解

F. Andreys Tree&#xff1a; 题目描述&#xff1a; 思路解析&#xff1a; 我们假设删除任意一个结点后&#xff0c;我们会将整个树切分为k个联通块&#xff0c;那么可以明确的知道我们只需要连接(k-1)条边就可以将这k个联通块重新连为一棵树。 那么最小代价是啥呢? 图解分…

linux 安装JDK

一、安装jdk mkdir -p /export/servers # 软件安装的目录 0 . 使用rpm -qa | grep java 查看是否已经安装了jdk 使用: rpm -e --nodeps 软件的名称 将jdk进行卸载 执行完成后, 查看是否全部删除: 需要解压jdk的压缩包 tar -zxvf jdk-8u144-linux-x64.tar.gz -C /export/s…

如何利用AI制作Twitter推文

智能生活新体验&#xff1a;最新会话式AI如何让您的日常更便捷 人工智能制作Twitter推文时&#xff0c;会运用多种策略确保推文既简洁又有影响力。首先&#xff0c;人工智能会分析大量数据来理解不同话题的流行趋势、热门话题标签和目标受众的偏好。接着&#xff0c;它会根据这…

嵌入式面向对象学习 RT-Thread I/O 设备管理框架 设备驱动层 案例测试

嵌入式面向对象 RT-Thread I/O 设备管理框架 设备驱动层 注&#xff1a;本文介绍性内容转载于《RT-Thread记录&#xff08;十、全面认识 RT-Thread I/O 设备模型&#xff09;》 注&#xff1a; 本次使用的开发板 &#xff1a; ​ 兆易创新GD32F407VET6开发板 ​ 雅特力科技…

3D模型缩略:创造简洁而有效的呈现---模大狮模型网

在3D设计和渲染中&#xff0c;有时候我们需要在有限的空间内展示复杂的场景或模型。在这种情况下&#xff0c;将整个模型完整地呈现出来可能会显得过于拥挤或混乱。因此&#xff0c;使用缩略图是一种常见且有效的方法&#xff0c;可以简化场景&#xff0c;突出重点&#xff0c;…

第十讲 Query Execution Part 1

1 处理模型【Processing Model】 DBMS 的处理模型【Processing Model】定义了系统如何执行【execute】查询计划【Query Plan】。 针对不同的工作负载进行不同的权衡。 方法1&#xff1a;迭代器模型【Iterator Model】 方法2&#xff1a;物化模型【Materialization Model】 方…

HTML基础知识详解(下)(如果想知道html的全部基础知识点,那么只看这一篇就足够了!)

前言&#xff1a;在上一篇文章中&#xff0c;我们已经学习完了超链接标签、列表标签和表格标签&#xff0c;但是我们还有一些标签没有学习&#xff0c;在这篇文章中&#xff0c;我们将学习剩余的标签。 ✨✨✨这里是秋刀鱼不做梦的BLOG ✨✨✨想要了解更多内容可以访问我的主页…

Spring Boot集成JWT快速入门demo

1.JWT是什么&#xff1f; JWT&#xff0c;英文全称JSON Web Token&#xff1a;JSON网络令牌。为了在网络应用环境间传递声明而制定的一种基于JSON的开放标准(RFC 7519)。这个规范允许我们使用JWT在客户端和服务端之间传递安全可靠的信息。JWT是一个轻便的安全跨平台传输格式&am…

智能语音机器人ai外呼机器人的运行原理和优势

在销售行业中&#xff0c;销售人员如果想尽可能的多获得客户&#xff0c;就需要不断的联系客户&#xff0c;慢慢孵化&#xff0c;但是效率十分低&#xff0c;尤其是在大量拨打电话的这一过程中&#xff0c;很多都是无效外呼&#xff0c;但是ai外呼机器人的出现完全改变了销售人…

自动驾驶中的交通标志识别原理及应用

自动驾驶中的交通标志识别原理及应用 附赠自动驾驶学习资料和量产经验&#xff1a;链接 概述 道路交通标志和标线时引导道路使用者有秩序使用道路&#xff0c;以促进道路行车安全&#xff0c;而在驾驶辅助系统中对交通标志的识别则可以不间断的为整车控制提供相应的帮助。比如…