【2024.2.1练习】岛屿个数(15分)

题目描述


题目思路

题目乍一看类似于“水坑个数问题”,是对陆地块进行DFS,上下左右4个方向分别对应了四种状态转移,每块陆地进行搜索后变成海洋,最终搜索次数就是岛屿个数。

但在子岛屿存在的情况下,需要先对海洋块进行DFS,由于不被岛屿包围的海洋能够通过八个方向流往地图边界,若最终没有能够流到边界,则说明这片水域是在某块岛屿内部,将水域填充成陆地,这样就能让每片大岛屿与它的所有子岛屿连成一片,消除所有子岛屿。然后再进行上述的搜索就能统计出不包含子岛屿的岛屿个数了。


我的代码

值得注意的是,一开始我的地图存储数组是int类型的,但是在输入01串的时候,本来代表地图一行的011101会被理解成一个整数,为了按位读取数据,需要将数组的类型改成char类型。

另外重要的一点,在进行DFS或BFS时必须给已经搜索过的区域进行标记,在本就储存了信息的数组里不方便再添加标记,较好的方法说建立一个相同大小的数组用于储存是否已搜索的信息。由于我的代码总共用了三次DFS:前两次搜索的方向数为8,最后一次搜索方向数为4,总共的时间复杂度约为O(20m^2n^2),很有优化的空间,不过还是通过了所有测试点。

#include <iostream>
#include <algorithm>
using namespace std;
char map[52][52];
int view[52][52];
int dfs1(int x, int y) { //判断是否连接大海view[x][y] = 1;for (int dx = -1; dx <= 1; dx++) {for (int dy = -1; dy <= 1; dy++) //8方向循环{int nx = x + dx;int ny = y + dy;if (map[nx][ny] == '2') {return 1;}if (map[nx][ny] == '0' && view[nx][ny] == 0) {if (dfs1(nx, ny)) {return 1;}}}}return 0;
}
void dfs2(int x, int y,char f) {if (view[x][y] == 1) {view[x][y] = 0;map[x][y] = f;}for (int dx = -1; dx <= 1; dx++) {for (int dy = -1; dy <= 1; dy++){int nx = x + dx;int ny = y + dy;if (view[nx][ny] == 1) {dfs2(nx, ny,f);}}}
}
void dfs3(int x, int y) {map[x][y] = '0';int dx[4] = { -1,0,0,1 };int dy[4] = { 0,-1,1,0 };for (int i = 0; i < 4; i++) //四方向{int nx = x + dx[i];int ny = y + dy[i];if (map[nx][ny] == '1') {dfs3(nx, ny);}}
}
int main() {int m;int n;int i;int j;int T;cin >> T;//输入组数while (T--) {cin >> m >> n;//赋值for (i = 1; i <= m; i++) {for (j = 1; j <= n; j++){cin >> map[i][j];view[i][j] = 0;}}//地图边界for (i = 0; i <= n+1; i++){map[0][i] = '2';map[m+1][i] = '2';}for (j = 1; j <= m+1; j++){map[j][0] = '2';map[j][n+1] = '2';}//DFS1:寻找子岛屿//DFS2:消除子岛屿for (i = 1; i <= m; i++) {for (j = 1; j <= n; j++){if (map[i][j] == '0') {if (dfs1(i, j)) { //非子岛屿dfs2(i, j, '0');}else {//子岛屿dfs2(i, j, '1');}}}}for (i = 1; i <= m; i++) {for (j = 1; j <= n; j++){if (map[i][j] == '0') {if (dfs1(i, j)) {//非子岛屿dfs2(i, j, '0');}else {//子岛屿dfs2(i, j, '1');}}}}//DFS3:统计岛屿个数int ans = 0;for (i = 1; i <= m; i++) {for (j = 1; j <= n; j++){if (map[i][j] == '1') {ans++;dfs3(i, j);}}}cout << ans<< endl;}return 0;
}

这道题连续使用了多次深度优先搜索,很有练习的价值。同时DFS算法由于其递归的性质,失之毫厘差之千里,在小心打代码的同时也要使用尽量简单的逻辑,否则容易出BUG。

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

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

相关文章

binder android

文心一言的回答 Binder驱动是Android操作系统中用于进程间通信&#xff08;IPC&#xff09;的机制。它提供了一种高效、跨进程的数据传输方式&#xff0c;使得应用程序的不同组件可以在Android系统上互相通信。 Binder驱动基于Linux内核&#xff0c;其核心组件是一个称为Bind…

基于最新koa的Node.js后端API架构与MVC模式

Koa 是一个由 Express 原班人马打造的现代 Web 框架&#xff0c;用于 Node.js。它旨在提供一个更小、更富有表现力和更强大的基础&#xff0c;用于 Web 应用和 API 开发。Koa 不捆绑任何中间件&#xff0c;它提供了一个优雅的方法以组合不同的中间件来处理请求和响应。 Koa 的核…

2024年哪款便签软件是手机电脑同步的?

在繁忙的生活、工作和学习中&#xff0c;我们时常面临各种琐事和任务&#xff0c;需要随时记录、提醒&#xff0c;以保持高效的生活节奏。比如&#xff0c;突然想到的灵感、重要的工作计划、紧急的购物清单&#xff0c;都需要一个便利的便签工具来随手记录。特别是在多终端使用…

vue2 el-form 两个时间框(第一个时间框是只能选择当前时间,之前的是不允许选择,第二个时间框是第一个时间的当前的时间后30天后可以选择的)

<template><div id"app"><el-form :model"form"><el-form-item label"预签时间"><el-date-picker v-model"form.t2" type"date" placeholder"选择预签时间" changepreSigning/><…

RT-DETR算法优化改进:上采样算子 | 超轻量高效动态上采样DySample,效果秒杀CAFFE,助力小目标检测

💡💡💡本文独家改进:一种超轻量高效动态上采样DySample, 具有更少的参数、FLOPs,效果秒杀CAFFE和YOLOv8网络中的nn.Upsample 💡💡💡在多个数据集下验证能够涨点,尤其在小目标检测领域涨点显著。 RT-DETR魔术师专栏介绍: https://blog.csdn.net/m0_63774211/…

C++ 音视频流媒体浅谈

C流媒体开发 今天就浅浅聊一下C流媒体开发 流媒体开发中最常见的是FFmpeg&#xff08;编解码器&#xff09; 业务逻辑主要是播放器了&#xff08;如腾旭视频 爱奇艺等等&#xff09; FFmpeg是一个开源的音视频处理工具集&#xff0c;可以用于处理、转换和流媒体传输音视频…

广州标点医药信息-米内网数据及咨询服务企业全方位解析!

米内网&#xff08;MENET&#xff09;原名中国医药经济信息网&#xff0c;由广州标点医药信息股份有限公司主办&#xff0c;2010年10月28日更名为“米内网”&#xff0c;上线初始主打医药销售数据库&#xff0c;经过十余年的迭代发展&#xff0c;现已成为国内主要的医药健康信息…

计网——应用层

应用层 应用层协议原理 网络应用的体系结构 客户-服务器&#xff08;C/S&#xff09;体系结构 对等体&#xff08;P2P&#xff09;体系结构 C/S和P2P体系结构的混合体 客户-服务器&#xff08;C/S&#xff09;体系结构 服务器 服务器是一台一直运行的主机&#xff0c;需…

数据结构·复杂度讲解

1. 什么是数据结构 数据结构(Data Structure)是计算机存储、组织数据的方式&#xff0c;指相互之间存在一种或多种特定关系的数据元素的集合。 数据结构是用来在内存中管理数据的&#xff0c;类似的&#xff0c;我们熟悉的文件或数据库是在硬盘中管理数据的。内存中的数据是带点…

【2024美赛】B题(中英文):搜寻潜水器Problem B: Searching for Submersibles

【2024美赛】B题&#xff08;中英文&#xff09;&#xff1a;搜寻潜水器Problem B: Searching for Submersibles 写在最前面2024美赛翻译 —— 跳转链接 中文赛题问题B&#xff1a;搜寻潜水器你的任务是&#xff1a; 词汇表 英文赛题Problem B: Searching for SubmersiblesYour…

基于VMware和Unbuntu18.04编译 嘉立创·泰山派 Linux SDK

主机硬件要求 内存最少32G 硬盘腾出200-500G&#xff0c;虽然编译最终占了73G&#xff0c;但富余一些以后可以搞别的方便 操作系统win7/10/11 VMware 安装 1.去vmware官网下载&#xff1a;https://customerconnect.vmware.com/cn/downloads/info/slug/desktop_end_user_comp…

小红书种草商品笔记违规,有哪些原因?

发布小红书笔记之后迟迟没有流量&#xff0c;内容过关但是浏览量突然变低是什么原因?如果出现上述情况&#xff0c;就可能是商品笔记被限制了。那么该如何重新获得流量呢?今天我们就来分享下小红书种草商品笔记违规&#xff0c;有哪些原因&#xff1f; 一、怎样判断被限流了 …

网络原理-TCP/IP(4)

TCP原理 滑动窗口 之前我们讲过了确认应答策略,对发送的每一个数据段,都要给一个ACK确认应答,收到ACK后再发送下一个数据段. 确认应答,超时重传,连接管理这样的特性都是为了保证可靠运输,但就是付出了传输效率(单位时间能传输数据的多少)的代价,因为确认应答机制导致了时间大…

Qt实现类似ToDesk顶层窗口 不规则按钮

先看效果&#xff1a; 在进行多进程开发时&#xff0c;可能会遇到需要进行全局弹窗的需求。 因为平时会使用ToDesk进行远程桌面控制&#xff0c;在电脑被控时&#xff0c;ToDesk会在右下角进行一个顶层窗口的提示&#xff0c;效果如下&#xff1a; 其实要实现顶层窗口&#xf…

计算机设计大赛 深度学习 python opencv 火焰检测识别

文章目录 0 前言1 基于YOLO的火焰检测与识别2 课题背景3 卷积神经网络3.1 卷积层3.2 池化层3.3 激活函数&#xff1a;3.4 全连接层3.5 使用tensorflow中keras模块实现卷积神经网络 4 YOLOV54.1 网络架构图4.2 输入端4.3 基准网络4.4 Neck网络4.5 Head输出层 5 数据集准备5.1 数…

力扣hot100 对称二叉树 递归

Problem: 101. 对称二叉树 文章目录 思路Code 思路 &#x1f468;‍&#x1f3eb; 参考 Code 时间复杂度: O ( n ) O(n) O(n) 空间复杂度: O ( n ) O(n) O(n) /*** Definition for a binary tree node.* public class TreeNode {* int val;* TreeNode left;* …

深入解剖指针篇(3)

个人主页&#xff08;找往期文章&#xff09; &#xff1a;我要学编程(ಥ_ಥ)-CSDN博客 目录 二级指针 指针数组 指针数组模拟二维数组 字符指针变量 数组指针 数组指针初始化 二维数组传参的本质 函数指针 函数指针的使用 typedef关键字 函数指针数组 二级指针…

缓存击穿,商详页进不去了!!!

故事 对于小猫来讲&#xff0c;最近的一段日子是不好过的&#xff0c;纵使听着再有节拍的音乐&#xff0c;也换不起他对生活的热情。由于上一次“幂等事件”躺枪&#xff0c;他已经有几天没有休息好了。他感觉人生到了低谷。 当接手这个商城项目之后&#xff0c;他感觉他一直没…

视频怎么加水印?分享两个简单的加水印的方法

在数字媒体时代&#xff0c;视频已经成为信息传播的重要方式。许多人在创作视频是会加上自己独特的水印&#xff0c;防止视频被盗用。水印作为数字版权保护技术的一种&#xff0c;可以有效地防止视频被非法复制、传播或篡改&#xff0c;从而保护创作者的权益和利益。下面我分享…

关闭idea之后,项目还在运行,端口被占用

今天在写项目的时候&#xff0c;中途安装了一个插件&#xff0c;而且插件显示需要重启idea&#xff0c;重启的时候项目正在运行&#xff0c;重启之后发现idea没有显示有项目正在运行&#xff0c;当我要开启项目的时候&#xff0c;发现无法开启&#xff0c;显示端口被占用了&…