代码随想录算法训练营day51:图论02:99. 岛屿数量;100. 岛屿的最大面积

news2024/11/28 11:58:17

99. 岛屿数量

卡码网题目链接(ACM模式)(opens new window)

题目描述:

给定一个由 1(陆地)和 0(水)组成的矩阵,你需要计算岛屿的数量。岛屿由水平方向或垂直方向上相邻的陆地连接而成,并且四周都是水域。你可以假设矩阵外均被水包围。

输入描述:

第一行包含两个整数 N, M,表示矩阵的行数和列数。

后续 N 行,每行包含 M 个数字,数字为 1 或者 0。

输出描述:

输出一个整数,表示岛屿的数量。如果不存在岛屿,则输出 0。

分析:

这道题题目是 DFS,BFS,并查集,基础题目。

本题思路,是用遇到一个没有遍历过的节点陆地,计数器就加一,然后把该节点陆地所能遍历到的陆地都标记上。——这个标记的过程,无所谓最短路径还是什么,所以dfs bfs都可以用

在遇到标记过的陆地节点和海洋节点的时候直接跳过。 这样计数器就是最终岛屿的数量。

那么如何把节点陆地所能遍历到的陆地都标记上呢,就可以使用 DFS,BFS或者并查集。

深搜

涉及到查找所有结点这种,都需要给他排除已经visited过的情况,需要visit数组!

#include <stdio.h> 
#include <stdlib.h> 
#include <stdbool.h>
#include <string.h>

int move[4][2]={0,1,1,0,0,-1,-1,0};


void dfs(int i,int j,int** visited,int **box,int m,int n){
    if(box[i][j]==0){
        return;
    }
    for(int k=0;k<4;k++){
        int fi=i+move[k][0];
        int fj=j+move[k][1];
        if(fi>=0 && fi<n && fj>=0 && fj<m && box[fi][fj]==1 && visited[fi][fj]==0) {
            visited[fi][fj]=1;
            dfs(fi,fj,visited,box,m,n);
        }
    }
}

int main(){
    int n,m;
    scanf("%d%d",&n,&m);
    int **box=(int **)malloc(sizeof(int*)*n);
    int **visited=(int **)malloc(sizeof(int*)*n);

    for(int i=0;i<n;i++){
        box[i]=(int*)malloc(sizeof(int)*m);
        visited[i]=(int*)malloc(sizeof(int)*m);
        for(int j=0;j<m;j++){
            scanf("%d",&box[i][j]);
            visited[i][j]=0;
        } 
        
        
    }

    int ans=0;

    for(int i=0;i<n;i++){
        for(int j=0;j<m;j++){
            if(box[i][j]==1 && visited[i][j]==0){
                ans++;
                dfs(i,j,visited,box,m,n);
            }
        }
        
    }
    printf("%d",ans);
    return ans;

}

广搜

一开始超时了:

根本原因是只要 加入队列就代表 走过,就需要标记,而不是从队列拿出来的时候再去标记走过

如果从队列拿出节点,再去标记这个节点走过,就会发生下图所示的结果,会导致很多节点重复加入队列。

应当:加入队列 就代表走过,立刻标记

#include <stdio.h> 
#include <stdlib.h> 
#include <stdbool.h>
#include <string.h>

int move[4][2]={0,1,1,0,0,-1,-1,0};
int queue[50000][2];

void bfs(int i,int j,int** box,int **visited,int front,int rear,int n,int m){
    rear++;//进队第一个
    queue[rear][0]=i;
    queue[rear][1]=j;
    visited[i][j]=1;

    while(front!=rear){//队非空
        front++;
        int xi=queue[front][0];//出队第一个,把相连的进队
        int xj=queue[front][1];
        
       
        for(int k=0;k<4;k++){
            int fi=xi+move[k][0];
            int fj=xj+move[k][1];
            if(fi>=0 && fi<n && fj>=0 && fj<m && box[fi][fj]==1 && visited[fi][fj]==0){
                rear++;//相连的进队
                visited[fi][fj]=1;
                queue[rear][0]=fi;
                queue[rear][1]=fj;
            }
        }
    }
}

int main(){
    int n,m;
    scanf("%d%d",&n,&m);
    int **box=(int **)malloc(sizeof(int*)*n);
    int **visited=(int **)malloc(sizeof(int*)*n);

    for(int i=0;i<n;i++){
        box[i]=(int*)malloc(sizeof(int)*m);
        visited[i]=(int*)malloc(sizeof(int)*m);
        for(int j=0;j<m;j++){
            scanf("%d",&box[i][j]);
            visited[i][j]=0;
        } 
    }

    int ans=0;
    

    for(int i=0;i<n;i++){
        for(int j=0;j<m;j++){
            if(box[i][j]==1 && visited[i][j]==0){
                ans++;
                bfs(i,j,box,visited,-1,-1,n,m);
            }
        }
    }

    printf("%d",ans);
    return 0;

}

100. 岛屿的最大面积

卡码网题目链接(ACM模式)(opens new window)

题目描述

给定一个由 1(陆地)和 0(水)组成的矩阵,计算岛屿的最大面积。岛屿面积的计算方式为组成岛屿的陆地的总数。岛屿由水平方向或垂直方向上相邻的陆地连接而成,并且四周都是水域。你可以假设矩阵外均被水包围。

输入描述

第一行包含两个整数 N, M,表示矩阵的行数和列数。后续 N 行,每行包含 M 个数字,数字为 1 或者 0,表示岛屿的单元格。

输出描述

输出一个整数,表示岛屿的最大面积。如果不存在岛屿,则输出 0。

分析:

遇到一个未标记且是陆地的点,开始计算面积,搜索完附近所有未标记且是陆地的点

**在递归的时候,面积计数不能成为函数传递的参数,应当用全局变量:

eg:1——2,5;2——3,4;遍历完3、4回到5时,size应该继续增加,而不是用回1\2时的size参数

**读取输入,到数组时:scanf("%d",&box[i][j]);

#include <stdio.h> 
#include <stdlib.h> 
#include <stdbool.h>
#include <string.h>
#include <math.h>

int move[4][2]={0,1,1,0,0,-1,-1,0};
int ansmax=0;

int size;

void dfs(int i,int j,int** visited,int **box,int m,int n){
    if(box[i][j]==0){
        return;
    }
    for(int k=0;k<4;k++){
        int fi=i+move[k][0];
        int fj=j+move[k][1];
        if(fi>=0 && fi<n && fj>=0 && fj<m && box[fi][fj]==1 && visited[fi][fj]==0) {
            visited[fi][fj]=1;
            size++;
            ansmax=fmax(ansmax,size);
            dfs(fi,fj,visited,box,m,n);
        }
    }
}

int main(){
    int n,m;
    scanf("%d%d",&n,&m);
    int **box=(int **)malloc(sizeof(int*)*n);
    int **visited=(int **)malloc(sizeof(int*)*n);

    for(int i=0;i<n;i++){
        box[i]=(int*)malloc(sizeof(int)*m);
        visited[i]=(int*)malloc(sizeof(int)*m);
        for(int j=0;j<m;j++){
            scanf("%d",&box[i][j]);
            visited[i][j]=0;
        } 
    }

    for(int i=0;i<n;i++){
        for(int j=0;j<m;j++){
            if(box[i][j]==1 && visited[i][j]==0){//是陆地且未被访问过
                size=1;
                visited[i][j]=1;//访问了
                dfs(i,j,visited,box,m,n);
                ansmax=fmax(ansmax,size);
            }
        }
    }
    
    printf("%d",ansmax);
    return 0;

}

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

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

相关文章

PHP农场扶农系统智慧认养智慧乡村系统农场系统小程序源码

&#x1f331;科技赋能田园梦 —— 探索“农场扶农系统”与“智慧认养智慧乡村”新篇章&#x1f680; &#x1f308;【开篇&#xff1a;田园新风尚&#xff0c;科技引领未来】 在快节奏的都市生活中&#xff0c;你是否曾梦想过拥有一片属于自己的绿色天地&#xff1f;现在&am…

大一新生看过来,【入学证件照】这样拍才可以千万不要拍错了

大一新生在拍摄证件照时&#xff0c;确实需要注意一些关键点&#xff0c;以确保照片符合规定并能成功使用。‌不会的可以多看看我首页说明&#xff0c;VX小城续&#xff1a;桃子证件照&#xff0c;帮你搞定大学四年所以的照片可以打印邮寄 首先&#xff0c;重要的是要注意以下几…

通信总线-串口/IIC/SPI

基本概念 1.串行&#xff1a;只有一个数据线&#xff0c;bit&#xff08;位&#xff09;一个一个传输&#xff08;本质传输的是电信号&#xff0c;高低电平代表0或1&#xff09; 更常用&#xff08;UART&#xff0c;IIC&#xff0c;SPI&#xff09; 2.并行&#xff1a;多个…

企业文件防泄密怎么做?10款透明加密软件排行榜

在信息时代&#xff0c;企业的核心竞争力往往体现在其拥有的知识和信息上&#xff0c;而企业文件的安全性直接关系到这些信息的保护。文件防泄密已成为企业管理中的重要议题&#xff0c;透明加密技术因其无缝集成和高效保护的特性&#xff0c;成为企业防泄密的首选方案。2024年…

RabbitMQ与ElasticSearch面试

目录 RabbitMQ 1、你们项目中哪里用到了RabbitMQ 2、为什么会选择使用RabbitMQ 3、使用RabbitMQ如何保证消息不丢失 4、消息的重复消费问题如何解决的 5、如何解决消息堆积在MQ的问题 6、RabbitMQ如何保证消费的顺序性 7、RabbitMQ的延迟队列有了解过嘛 8、RabbitMQ如…

<数据集>流水线物件识别数据集<目标检测>

数据集格式&#xff1a;VOCYOLO格式 图片数量&#xff1a;8643张 标注数量(xml文件个数)&#xff1a;8643 标注数量(txt文件个数)&#xff1a;8643 标注类别数&#xff1a;26 标注类别名称&#xff1a;[Crankshaft, Centrifugal_body, Washer_container, Circlip_containe…

FTP协议-匿名用户登录 从0到1

前言 日常大家可能接触web漏洞比较多而对其他端口及协议不那么了解&#xff0c;其实其他协议漏洞在渗透中也同样重要只是平时可能接触得不多。本文将介绍FTP协议、FTP匿名用户登录及其具体流程分析和自动化利用demo。 FTP简介 FTP是File Transfer Protocol&#xff08;文件传…

利用Aspose.BarCode 在 C# 中创建微型二维码

Aspose.BarCode提供多种编程语言的 API&#xff0c;例如Java、Python、C等。它提供了强大的解决方案&#xff0c;可以通过编程创建和处理条形码和二维码&#xff0c;我们将实现如何使用Aspose.BarCode for .NET在 C# 中创建微型二维码。接下来&#xff0c;我们还将演示如何以编…

软件测试工程师是做什么的?

软件测试工程师扮演着软件开发过程中的关键角色&#xff0c;他们的主要职责是对软件进行全面的测试&#xff0c;确保其质量和稳定性。 随着软件行业的迅猛发展&#xff0c;对这类专业人才的需求也在不断增长。 本文将深入探讨软件测试工程师的职责及其所需的技能。 一、软件测…

新技术能够区分真实照片和 AI 伪造图片,但为何平台没有使用?|TodayAI

随着生成式 AI 图像工具的快速发展&#xff0c;网络上越来越多的图像真假难辨。尽管已有技术能够区分真实照片和 AI 伪造图片&#xff0c;但大多数在线平台尚未充分利用这一技术。随着美国总统大选临近&#xff0c;网络上充斥着关于候选人唐纳德特朗普和卡玛拉哈里斯的各种照片…

组合模式 详解

组合模式 简介: 将对象组合成树形结构以表示"部分-整体"的层次结构, 使得用户对单个对象和组合对象的使用具有一致性. 组合模式也是一种结构类型的模式.看简介比较容易理解, 毕竟树形结构是数据结构必修的, 我们仍然举个例子方便理解 以公司的组织架构为例 公司 - …

Web大学生网页作业成品——明星EXO介绍网页设计与实现(HTML+CSS)(10个页面)(TABLE布局)

&#x1f389;&#x1f389;&#x1f389; 常见网页设计作业题材有**汽车、环保、明星、文化、国家、抗疫、景点、人物、体育、植物、公益、图书、节日、游戏、商城、旅游、家乡、学校、电影、动漫、非遗、动物、个人、企业、美食、婚纱、其他**等网页设计题目, 可满足大学生网…

LED 数码显示管的结构

LED 数码显示管是一种常用的字符显示器件,能与 CMOS、TTL 等集成电路直接配合,作静态、动态扫描显示之用。图12-33(a)是LED数码显示管的实物图&#xff0c;图 12-33(b)是LED数码显示管的内部结构。它实际上是由8个发光二极管构成的&#xff0c;其中7个发光二极管排列成“8”字形…

【线性表】内容总结

1.单链表&#xff0c;循环链表&#xff0c;双向链表的循环效率 2.顺序表和链表的比较 1.什么是存储密度 1.定义&#xff1a; 存储密度是指结点数据本身所占的存储量和整个结点结构中所占的存储量 之比&#xff0c;即: 2.实例 比如在32位系统上&#xff0c;一个12字节的结…

保姆级Python与PyCharm安装教程

本文演示所用的所用的所有工具包都已经打包好了&#xff0c;【点击这里】即可获得 一、简介 Python是一种广泛使用的高级编程语言&#xff0c;因其简洁的语法和丰富的库支持&#xff0c;在数据科学、Web开发、人工智能等领域广受欢迎。PyCharm是由JetBrains开发的一款针对Pyt…

一篇文章带你了解归并排序-分治法

文章目录 两个有序数组排序一个局部有序数组排序分治法归并排序 两个有序数组排序 先来一个场景假设&#xff0c;先有两个有序数组{1,3,5,9}、{2,4,6,8}&#xff0c;要求合并成一个有序数组。 我们先上一段简单的处理代码 public static int[] merge(int[] leftArr, int[] righ…

Redis后台线程之非阻塞删除

当Redis执行删除命令的时候&#xff0c;如果被删除的对象是列表、集合、散列类型&#xff0c;因为这些数据类型包含的元素存放在不同的内存块中&#xff0c;redis需要遍历所有元素来释放其对应的内存块空间&#xff0c;这个耗时操作可能导致redis阻塞&#xff0c;redis4提供的U…

[数据集][目标检测]agvs仓储机器人检测数据集VOC+YOLO格式967张3类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;967 标注数量(xml文件个数)&#xff1a;967 标注数量(txt文件个数)&#xff1a;967 标注类别…

API接口安全101:基础概念与最佳实践

文章目录 API定义协议架构风格描述语言 Webservicewsdl介绍复现 SOAPswagger介绍指纹查找利用存在目录复现 HTTPWebpack介绍复现 在当今数字化时代,API接口已成为现代软件架构中不可或缺的组成部分。它们连接着各种应用程序和服务,促进了数据交换和功能集成。然而,随着API的普及…

【PyTorch】神经网络的基本骨架-nn.Module的使用以及convolution-layers卷积层介绍

前提文章目录 【PyTorch】深度学习PyTorch环境配置及安装【详细清晰】 【PyTorch】深度学习PyTorch加载数据 【PyTorch】关于Tensorboard的简单使用 【PyTorch】关于Transforms的简单使用 【PyTorch】关于torchvision中的数据集以及dataloader的使用 文章目录 前提文章目录nn.…