F.岛屿个数【蓝桥杯】/dfs+环

岛屿个数

小蓝得到了一副大小为 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 的子岛屿。

请问这个地图上共有多少个岛屿?在进行统计时不需要统计子岛屿的数目。
在这里插入图片描述

对于第一组数据,包含两个岛屿,下面用不同的数字进行了区分:
01111
11001
10201
10001
11111
岛屿 2 在岛屿 1 的 “环” 内部,所以岛屿 2 是岛屿 1 的子岛屿,答案为 1。

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

注意屿 3 并不是岛屿 1 或者岛屿 2 的子岛屿,因为岛屿 1 和岛屿 2 中均没有“环”。

对于 30% 的评测用例,1 ≤ M, N ≤ 10。
对于 100% 的评测用例,1 ≤ T ≤ 10,1 ≤ M, N ≤ 50。

dfs+环

搜出所有的岛屿,这个不难做到。由于岛屿之间相互隔离,则如果岛屿的一个格子在一个环内,那么整个岛屿也都在环内。遍历所有的岛屿,选中当前岛屿的第一个格子,搜索周围海洋,若能搜索到地图的边界外,则此岛屿不在任何一个环内;否则,此岛屿在某个环内,岛屿数量减一。

注意:搜索海洋时要搜索八个方向!!详见第二个示例,只搜四个方向不行。

#include <iostream>
using namespace std;
int b[4]={1,0,-1,0};
int c[4]={0,1,0,-1};
int d[8]={1,0,-1,0,1,1,-1,-1};
int e[8]={0,1,0,-1,1,-1,1,-1};
void dfs(char a[][55],int visited[][55],int x,int y,int m,int n)
{
    visited[x][y]=1;
    for(int i=0;i<4;i++)
    {
        int xx=x+b[i],yy=y+c[i];
        if(xx>=0&&xx<m&&yy>=0&&yy<n&&a[xx][yy]=='1'&&!visited[xx][yy]) dfs(a,visited,xx,yy,m,n);
    }
}
bool ifHuan(char a[][55],int visit[][55],int x,int y,int m,int n)
{
    visit[x][y]=1;
    for(int i=0;i<8;i++)
    {
        int xx=x+d[i],yy=y+e[i];
        if(xx<0||xx>=m||yy<0||yy>=n) return 1;
        else if(a[xx][yy]=='0'&&!visit[xx][yy]&&ifHuan(a,visit,xx,yy,m,n)) return 1; 
    }
    return 0;
}
int main()
{
    int t;
    cin>>t;
    for(int i=0;i<t;i++)
    {
        int m,n;
        cin>>m>>n;
        char a[55][55];
        for(int j=0;j<m;j++) 
        {
            for(int k=0;k<n;k++) 
            {
                cin>>a[j][k];
            }
        }
        int visited[55][55];
        for(int j=0;j<55;j++) for(int k=0;k<55;k++) visited[j][k]=0;
        int res=0;
        for(int j=0;j<m;j++)
        {
            for(int k=0;k<n;k++)
            {
                if(a[j][k]=='1'&&!visited[j][k])
                {
                    dfs(a,visited,j,k,m,n);
                    res++;
                    int visit[55][55];
                    for(int t=0;t<m;t++) for(int r=0;r<n;r++) visit[t][r]=0;
                    if(!ifHuan(a,visit,j,k,m,n)) res--;
                }
            }
        }
        cout<<res<<endl;
    }
    return 0;
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

记一次生产慢sql索引优化及思考

记一次生产慢sql索引优化及思考 问题重现 夜黑风高的某一晚&#xff0c;突然收到一条运营后台数据库慢sql的报警&#xff0c;耗时竟然达到了60s。看了一下&#xff0c;还好不是很频繁&#xff0c;内心会更加从容排查问题&#xff0c;应该是特定条件下没有走到索引导致&#x…

Jmeter---逻辑控制器

if 控制器 1. 先添加一个 用户自定义的变量&#xff0c;并填写变量名和值 2.再添加一个if控制器&#xff0c;并填写判断内容 【语法&#xff1a;""""】 forEach控制器 1. 先添加一个用户自定义变量 2. 再添加一个forEach控制器 循环控制器 1. 添加循环…

【2024-03-12】设计模式之模板模式的理解

实际应用场景&#xff1a;制作月饼 过程描述&#xff1a; 一开始&#xff0c;由人工制作月饼&#xff0c; 第一个&#xff1a;根据脑子里面月饼的形状&#xff0c;先涅出月饼的形状&#xff0c;然后放入面粉和馅料把开口合并起来。 第二个&#xff1a;根据脑子里面月饼的形状&…

ASP.NET排课实验室排课,生成班级课表实验室课表教师课表(vb.net)-214-(代码+说明)

转载地址: http://www.3q2008.com/soft/search.asp?keyword214 要看成品演示 请联系客服发给您成品演示 课题&#xff1a;实验课排课系统 计算机 上机课 一周上5天课&#xff0c;周一到周五 一周上5天课&#xff0c;周一到周五 因为我排的是实验课&#xff0c;最好1&#xf…

【Paper Reading】6.RLHF-V 提出用RLHF的1.4k的数据微调显著降低MLLM的虚幻问题

分类 内容 论文题目 RLHF-V: Towards Trustworthy MLLMs via Behavior Alignment from Fine-grained Correctional Human Feedback 作者 作者团队&#xff1a;由来自清华大学和新加坡国立大学的研究者组成&#xff0c;包括Tianyu Yu, Yuan Yao, Haoye Zhang, Taiwen He, Y…

HTML静态网页成品作业(HTML+CSS)——家乡广州介绍设计制作(5个页面)

&#x1f389;不定期分享源码&#xff0c;关注不丢失哦 文章目录 一、作品介绍二、作品演示三、代码目录四、网站代码HTML部分代码 五、源码获取 一、作品介绍 &#x1f3f7;️本套采用HTMLCSS&#xff0c;未使用Javacsript代码&#xff0c;共有5个页面。 二、作品演示 三、代…

SpringBoot(Lombok + Spring Initailizr + yaml)

1.Lombok 1.基本介绍 2.应用实例 1.pom.xml 引入Lombok&#xff0c;使用版本仲裁 <!--导入springboot父工程--><parent><artifactId>spring-boot-starter-parent</artifactId><groupId>org.springframework.boot</groupId><version&g…

[论文笔记] pai-megatron qwen1.5报错

Qwen1.5-0.5b-chat 使用example中fintune.py 报错 Issue #77 QwenLM/Qwen1.5 GitHub 解决方案&#xff1a; transformers升级到4.37.0 pip install setuptools65.5.1 pip install transformers4.37.0

Matlab|【分布鲁棒】数据驱动的多离散场景电热综合能源系统分布鲁棒优化算法

目录 主要内容 1.1 主要难点-分布鲁棒优化 1.2 程序求解步骤-主子问题迭代 部分结果 下载链接 主要内容 本程序主要对《基于场景聚类的主动配电网分布鲁棒综合优化》-高海淑的方法复现&#xff0c;应用到综合能源电热微网方向&#xff0c;采用拉丁超立方抽样对不同…

鸿蒙API9+axios封装一个通用工具类

使用方式&#xff1a; 打开Harmony第三方工具仓&#xff0c;找到axios&#xff0c;如图&#xff1a; 第三方工具仓网址&#xff1a;https://ohpm.openharmony.cn/#/cn/home 在你的项目执行命令&#xff1a;ohpm install ohos/axios 前提是你已经装好了ohpm &#xff0c;如果没…

【Flutter 面试题】怎么理解Flutter的Isolate?并发编程

【Flutter 面试题】怎么理解Flutter的Isolate&#xff1f;并发编程 文章目录 写在前面解答补充说明完整代码示例说明 写在前面 &#x1f64b; 关于我 &#xff0c;小雨青年 &#x1f449; CSDN博客专家&#xff0c;GitChat专栏作者&#xff0c;阿里云社区专家博主&#xff0c;…

Qt-QPainter drawText方法不同重载之间的区别

QPainter类的drawText方法有如下重载&#xff1a; void drawText(const QPointF &position, const QString &text) void drawText(const QPoint &position, const QString &text) void drawText(int x, int y, const QString &text) void drawText(co…

解决尚品甄选验证码图片无法显示bug

按照他的视频要求去做发现图片无法正常显示&#xff0c;通过查看浏览器网络错误&#xff0c;发现请求验证码的网址是重叠的http://localhost:3001/admin/system/index/login/admin/system/index/generateValidateCode是这样的&#xff0c;说明baseUrl是/admin/system/index/log…

【Python如何与电脑玩石头剪刀布游戏】

1、石头剪刀布Python代码如下&#xff1a; import random while True:a random.randint(0, 2)b int(input("请输入一个数字&#xff08;0石头, 1剪刀, 2布&#xff09;: "))c [石头, 剪刀, 布]if b ! 0 and b ! 1 and b ! 2:print("傻子&#xff0c;你出错了…

Cisco Packet Tracer模拟器实现路由器的路由配置及网络的安全配置

1. 内容 1. 配置路由器实现多个不同网络间的通信&#xff0c;路由器提供的路由协议包括静态路由协议、RIP动态路由、OSPF动态路由协议等等&#xff0c;训练内容包括路由器的静态路由配置、路由器的RIP动态路由配置、路由器的OSPF动态路由配置以及路由器的路由重分布配置。 2.…

测试环境搭建整套大数据系统(十一:docker部署superset,无密码登录嵌入html)

一&#xff1a;安装docker 参考文档 https://blog.csdn.net/weixin_43446246/article/details/136554243 二&#xff1a;安装superset 下载镜像。 拉取镜像&#xff08;docker pull amancevice/superset&#xff09; 查看镜像是否下载完成&#xff08;docker images&#xf…

Tomcat目录结构

文章目录 binconfliblogswebapp bin 存放tomcat的可执行程序 从上图可以看出bin中的文件主要是两种文件&#xff0c;一种是.bat一种是.sh .bat:主要用于windows .sh:主要用于linux .bat文件是Windows操作系统中的批处理文件。它是一种简单的文本文件&#xff0c;其中包含了一…

java内部类的作用与优缺点

一、前言 很久没看到java内部类了&#xff0c;今天在审查代码时候&#xff0c;发现了java内部类&#xff0c;主要是内部类还嵌套了内部类。于是记录一下 二、java内部类的作用与优缺点 Java内部类&#xff0c;也称为嵌套类&#xff0c;是定义在另一个类&#xff08;外部类&am…

pycharm 历史版本下载地址

pycharm 历史版本下载地址 老版本能用就行&#xff0c;不需要搞最新的&#xff0c;当然了&#xff0c;有些小伙伴就是喜欢新的&#xff08;最先吃螃蟹&#xff09; 博主就不搞最新了&#xff0c;哈哈 上菜&#xff1a; https://www.jetbrains.com/pycharm/download/other.html…

Python (用户登录、身份归属地查询添加异常处理、绘制多角星、电影信息提取)

任务一&#xff1a;用户登录 登录系统通常分为普通用户与管理员权限&#xff0c;在用户登录系统时&#xff0c;可以根据自身权限进行选择登录。本任务要求实现一个用户登录的程序&#xff0c;该程序分为管理员用户与普通用户&#xff0c;其中管理员账号密码在程序中设定&#…