蓝桥杯2023年第十四届省赛真题-岛屿个数|DFS

题目链接:

蓝桥杯2023年第十四届省赛真题-岛屿个数 - C语言网 (dotcpp.com)

参考视频:

 【[蓝桥杯]真题讲解:岛屿个数(BFS遍历图)】 https://www.bilibili.com/video/BV1uc411v7Tw/?share_source=copy_web&vd_source=9332b8fc5ea8d349a54c3989f6189fd3

(视频用了BFS,并且没有扩容,但是讲解很清楚)

参考题解:

两次DFS(染色法+合并)-Dotcpp编程社区

说明

1.为什么要扩容?

因为需要从一个外海(不在环里的海)作为起点,而在边界的海肯定是不在环里的,因为他至少有一个方向没有岛屿(边界之外全是海水)。后面发现不扩容也可以,直接搜索边界那一圈(i=0,j=0..n-1;i=m-1,j=0..n-1;j=0,i=0....m-1;j=n-1,i=0....m-1),如果有外海肯定能找到,因为不能找到,说明边界上全是1,为岛屿,那么地图内的海和岛屿肯定都在环内了,不用再数了。不过这样就不能一次dfs,要搜索还有没有没访问的外海,有的话要从这个外海开始一次dfs。


2.const int M = 52;//为什么数组大小是52?

因为,由题:对于 100% 的评测用例,1 ≤ T ≤ 10,1 ≤ M, N ≤ 50。

至少要52,因为有时右下角被环挡住了,如果用51只有上边和左边多了海,不再加一行一列的话,访问不到右下角不在环里的海水和岛屿  。

如:0 0 0 0 0
      0|1 1 1 1 |
      0|1 1 1 1 |
      0|1 1 1 0 |
      0|1 1 0 1 |
      显然从0,0开始是不能访问到右下角的不在环里的岛屿和海水的。

3.环里的海和岛屿可以看成跟环是一体的,当外面所有的海水都染色之后,从环上出发DFS(四连通),遇到1和0都是一样的,不用再去把0染成1,所以把这部分代码注释了。

4.注意细节:下标的检查,海水DFS时最外那一圈也要走;多组测试数据,每组开始要清空清数,和最外层的标记。

#include<iostream>
//#include<bits/stdc++.h>
#define int long long
using namespace std;
//为什么要扩容?因为需要从一个外海(不在环里的海)作为起点,出发 
const int M = 52;//至少要52,因为有时右下角被环挡住了,如果不再加一行一列的话,访问不到右下角不在环里的海水和岛屿 ,例子见下面dfs的例子 
const int N = 52;
int mp[M][N] = { 0 };
int t;
int m, n;
int dx[8] = { 0,1,1,1,0,-1,-1,-1 };
int dy[8] = { 1,1,0,-1,-1,-1,0,1 };
int ans = 0;
void dfs(int x, int y) {if (mp[x][y] == 0)  mp[x][y] = 2;for (int k = 0; k < 8; k++) {int xx = x + dx[k], yy = y + dy[k];//注意这里要把最外层考虑到,因为有时需要走外层的海水才能到达右下角的海水;岛屿染色时不用考虑/*比如:0 0 0 0 0--------0|1 1 1 1 |0|1 1 1 1 |0|1 1 1 0 |0|1 1 0 1 |--------显然从0,0开始是不能访问到右下角的不在环里的岛屿和海水的, */ if (xx >= 0 && yy >= 0 && xx <= m+1 && yy <= n+1) {if (mp[xx][yy] == 0)dfs(xx, yy);}}
}
void dfsland(int x, int y) {if (mp[x][y] == 1||mp[x][y] ==0) {mp[x][y] = 2;}for (int k = 0; k < 8; k = k + 2) {int xx = x + dx[k], yy = y + dy[k];if (xx >= 1 && yy >= 1 && xx <= m && yy <= n) {if (mp[xx][yy] ==1||mp[xx][yy] ==0)dfsland(xx, yy);}}}signed main() {scanf("%d", &t);while (t--) {ans = 0;cin >> m >> n;//注意:每次要把矩阵全部重新清0,因为输入的时候没输入外层//(在原有地图的外面多加了一层)的海水,所以上一次的影响还在//检查了好几遍才发现是这里遗漏了for (int i = 0; i <= m+1; i++) {for (int j = 0; j <= n+1; j++) {mp[i][j] = 0;}}//整数数组。输入时要规定每次只输入一位 for (int i = 1; i <= m; i++) {for (int j = 1; j <= n; j++) {scanf("%1d", &mp[i][j]);}}//0,0处是新加的外层,一定为海水,从此处开始(八连通)一定可以到达所有不在环里的海水//没到达的海水就在环里,没被染色,相当于这部分海水是一个岛屿的一部分dfs(0,0);//环里的海水染色成岛屿,这样如果存在子岛屿,可以通过四连通走到。即可认为是环和子岛屿是一个岛屿
//        for(int i=1;i<=m;i++){
//                for(int j=1;j<=n;j++){
//                    if(mp[i][j]==0){
//                        mp[i][j]=1;
//                    }
//                }
//            }//从一个岛屿出发,四连通走,染色for(int i=1;i<=m;i++){for(int j=1;j<=n;j++){if(mp[i][j]==1){ans++;dfsland(i,j);}}}cout << ans <<endl;}return 0;
}

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

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

相关文章

Java+SpringBoot+Vue+MySQL:农业管理新篇章

✍✍计算机毕业编程指导师 ⭐⭐个人介绍&#xff1a;自己非常喜欢研究技术问题&#xff01;专业做Java、Python、微信小程序、安卓、大数据、爬虫、Golang、大屏等实战项目。 ⛽⛽实战项目&#xff1a;有源码或者技术上的问题欢迎在评论区一起讨论交流&#xff01; ⚡⚡ Java、…

Z Potentials | 星爵,他的征途不止向量数据库

纵观过去几十年的科技发展史&#xff0c;每一代新的技术架构的出现往往都伴随着新的数据范式的出现&#xff0c;也催生了多家百亿到千亿美金数据平台的诞生。如果说 2023 年科技领域的关键词是 LLM&#xff0c;那么数据库领域的关键词一定非向量数据库莫属。向量数据库是一种专…

【项目实践04】【RocketMQ消息收发拦截器】

文章目录 一、前言二、项目背景三、实现方案1. 关键接口2. 消息发送方3. 消息消费方4. 配置引入类5. 使用示例 四、思路扩展1. 消费流程简介 一、前言 本系列用来记录一些在实际项目中的小东西&#xff0c;并记录在过程中想到一些小东西&#xff0c;因为是随笔记录&#xff0c…

Vision Transformer结构解析

ViT简介 Vision Transformer。transformer于2017年的Attention is all your need提出&#xff0c;该模型最大的创新点就是将transformer应用于cv任务。 论文题目&#xff1a;An Image is Worth 16x16 Words: Transformers for Image Recognition at Scale 论文链接&#xff1…

501.二叉搜索树的众数

501.二叉搜索树中的众数 思路 第一眼&#xff0c;中序遍历哈希表找最大出现次数解题&#xff0c;暴力解法。需要中序遍历一遍哈希表取最大值一遍哈希表根据最大值找对应键一遍。复杂度3n。 后续&#xff0c;可根据二叉搜索树性质来解&#xff0c;在中序遍历时对前后两个相邻…

【工具相关】showdoc文档管理平台部署实践

文章目录 一、前言1、需求来由2、showdoc说明 二、部署安装1、docker安装2、showdoc安装3、设置开机自启 三、数据备份1、docker镜像备份2、showdoc数据备份 四、数据恢复1、docker镜像恢复2、showdoc数据恢复 五、常用操作1、镜像相关2、容器相关 一、前言 1、需求来由 内部…

Apache POI Excel的读写

1、 POI介绍 Apache POI是用Java编写的免费开源的跨平台的Java API&#xff0c;Apache POI提供API给Java程 序对Microsoft Office格式档案读和写的功能&#xff0c;其中使用最多的就是使用POI操作Excel文 件。 jxl&#xff1a;专门操作Excel maven坐标&#xff1a; POI结构:…

【Vue3-vite】动态导入路由

route文件结构 router moduleindex.ts 路由定义 // 需要导入的路由如下&#xff1a; const routes [{path: /manage,name: manage,component: () > import(/views/home/index.vue),children: manageRoutes,}]index.ts实现从module中自动导入 // 动态导入 const routeFil…

【信息系统项目管理师】--【信息技术发展】--【新一代信息技术及应用】--【虚拟现实】

文章目录 第二章 信息技术发展2.2 新一代信息技术及应用2.2.6 虚拟现实1.技术基础2.关键技术3.应用和发展 第二章 信息技术发展 信息技术是在信息科学的基本原理和方法下&#xff0c;获取信息、处理信息、传输信息和使用信息的应用技术总称。从信息技术的发展过程来看&#xff…

封关了,不仅封掉了港漂们方便的回家之路

封关不仅堵住了港漂回国的便捷途径&#xff0c;也堵住了港漂修理内地大大小小的电器的路。 香港当然有维修工。 听邻居说修一个漏水的水龙头要港币1000元&#xff0c;检查微波炉要港币600元。 更换主板需要4000元&#xff0c;比新机还贵。 收回坏掉的洗衣机修理费是14000元&am…

专家解读:2024年十大项目管理工具综合排名与评价

2024年涌现出一批新的项目管理工具&#xff0c;各具特色的功能和设计为企业解决了诸多的管理难题。今天我们就来盘点2024年的十款项目管理工具Zoho Projects、AgileMaster、PlanItAll、CommuniQ、WorkFlowRanger、GanttGenius、RiskAssessor、TeamHarmony、BudgetBoss、CloudCo…

Qt6.6搭建WebAssembly

1.首先安装python &#xff0c; 链接&#xff1a;https://www.python.org/ 2.下载并安装qt6. 3.克隆emsdk工程 3.1 进入emsdk目录&#xff0c;然后更新emsdk代码 3.2 下载并安装最新的SDK工具。&#xff08;C:\Qt\emsdk>emsdk install --global latest&#xff09; 3.3…

【C++】C/C++内存管理详解

个人主页 &#xff1a; zxctscl 文章封面来自&#xff1a;艺术家–贤海林 如有转载请先通知 目录 1. 前言2. C/C内存分布3. C语言中动态内存管理方式4. C中动态内存管理4.1 new/delete操作内置类型4.2 new和delete操作自定义类型 5. operator new与operator delete函数5.1 oper…

算法沉淀——动态规划之其它背包问题与卡特兰数(leetcode真题剖析)

算法沉淀——动态规划之其它背包问题与卡特兰数 二维费用的背包问题01.一和零02.盈利计划 似包非包组合总和 Ⅳ 卡特兰数不同的二叉搜索树 二维费用的背包问题 01.一和零 题目链接&#xff1a;https://leetcode.cn/problems/ones-and-zeroes/ 给你一个二进制字符串数组 strs…

大语言模型LLM学习梳理

一、介绍 今天问了下晓宇关于LLM的知识&#xff0c;学到了很多&#xff0c;总结下。 二、开源的大型语言模型&#xff08;LLM&#xff09;包含哪些东西&#xff1f; 模型包含两块内容&#xff1a; 框架。 框架就是函数和代码逻辑的组合。 可能有多层&#xff0c;每层可能有很…

【网络】主机连接 TCP 三次握手

【网络】主机连接 TCP 三次握手 一、TCP连接3次握手二、TCP连接4次挥手三、为什么tcp要三次握手&#xff0c;两次行不四、为什么TCP挥手需要4次五、Netstat命令的连接状态包括:六、练习题 一、TCP连接3次握手 1、建立连接的时候是3次握手&#xff0c;客户端向服务器端发送SYN&…

数据结构界的终极幻神----树

目录 一.数的概念和分类 种类 二.重点概念 哈希树: 二叉树的线索化 什么是线索化 为什么要线索化 特殊的查找树 完全二叉树 三.手撕完全二叉树(堆) 重点讲解 向上搜索算法 向下搜索算法 一.数的概念和分类 树&#xff08;tree&#xff09;是包含 n(n≥0) [2] 个节…

Shopee 虾皮运营六大核心技巧,下一个大卖就是你

对于新手卖家来说&#xff0c;店铺运营是头等大事。运营得当就能获取相应的收益&#xff0c;那么Shopee 虾皮运营的核心技巧是什么呢&#xff1f;今天给大家分享6⃣大核心技巧&#xff0c;学会了下个大卖就是你。 Shopee 虾皮运营六大核心技巧 1️⃣ 分时段上新 &#x1f4cc;…

3Dmax中VR渲染太阳光渲染参数怎么设置?渲染100云渲染助力

我们用3Dmax建模时一些场景会用到太阳光&#xff0c;那么渲染参数是如何设置的呢&#xff1f; 我们一起来看看&#xff0c;直接上图 以上就是详细的参数设置&#xff0c;大家可以用做参考&#xff0c;如果本地渲染慢的朋友可以考虑使用云渲染100 机器多&#xff0c;渲染稳定不…

android 快速实现 垂直SeekBar(VerticalSeekBar)

1.话不多说上源码&#xff1a; package com.example.widget;import android.content.Context; import android.graphics.Canvas; import android.util.AttributeSet; import android.view.MotionEvent;/*** Class to create a vertical slider*/ public class VerticalSeekBar…