首页 > 编程语言 >孤岛的总面积(Dfs C#

孤岛的总面积(Dfs C#

时间:2024-11-03 16:16:25浏览次数:3  
标签:firstLine C# 岛屿 Dfs int grid 孤岛

卡码网  101题 

 力扣第

1254. 统计封闭岛屿的数目 也是一样的 差不多是一道题  

101. 孤岛的总面积

题目描述

给定一个由 1(陆地)和 0(水)组成的矩阵,岛屿指的是由水平或垂直方向上相邻的陆地单元格组成的区域,且完全被水域单元格包围。孤岛是那些位于矩阵内部、所有单元格都不接触边缘的岛屿。

现在你需要计算所有孤岛的总面积,岛屿面积的计算方式为组成岛屿的陆地的总数。

输入描述

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

输出描述

输出一个整数,表示所有孤岛的总面积,如果不存在孤岛,则输出 0。

输入示例
4 5
1 1 0 0 0
1 1 0 0 0
0 0 1 0 0
0 0 0 1 1
输出示例
1
提示信息

在矩阵中心部分的岛屿,因为没有任何一个单元格接触到矩阵边缘,所以该岛屿属于孤岛,总面积为 1。

数据范围:

1 <= M, N <= 50。

看力扣题解是有很多种方法 深搜中有 用bool DFs的 也有用边长的 但是我没太看懂边长的版本 

代随的方法是 先清理完四边的陆地再普通深搜搜一遍岛屿数量 然后将每个岛屿的面积相加 感觉比较清晰简单故采用这个方法

思路:先清理完四边的陆地再普通深搜搜一遍岛屿数量 然后将每个岛屿的面积相加 

using System;

class Program
{
    static void Main()
    {
        //读取输入
        string[] firstLine=Console.ReadLine().Split();//读取一行输入并将其分割成一个字符串数组
        int n=int.Parse(firstLine[0]);
        int m=int.Parse(firstLine[1]);
        //总面积
        int result=0;
        //填充岛屿
        int[,] grid=new int[n,m];
        
        for(int i=0;i<n;i++)
        {
            firstLine=Console.ReadLine().Split();
            for(int j=0;j<m;j++)     //填充每一行
            {
                grid[i,j]=int.Parse(firstLine[j]);
            }
        }
        
        //计算岛屿总面积
        int SumLand =AreaIsland(grid,n,m);
        Console.WriteLine(SumLand);
    }
    //遍历整个数组并且将每一个岛屿的面积相加
    public static int AreaIsland(int[,]grid ,int n,int m)
    {
         //清理上下左右边界的陆地
         for(int i=0;i<m;i++)
        {
            if(grid[0,i]==0)//如果第一行找到土地 直接DFS全变为水
            {
                Dfs(grid,0,i,n,m);
            }
            if(grid[n-1,i]==0)
            {
                Dfs(grid,n-1,i,n,m);
            }
        }
        //左右列
        for(int j=0;j<n;j++)
        {
            if(grid[j,0]==0)//如果第一列找到土地 直接DFS全变为水
            {
                Dfs(grid,j,0,n,m);
            }
            if(grid[j,m-1]==0)
            {
                Dfs(grid,j,m-1,n,m);
            }
        }
        for(int i=0;i<n;i++)
        {
            for(int j=0;j<m;j++)
            {
                if(grid[i,j]==1)
                {
                    
                   int s= Dfs(grid,i,j,n,m);
                   result+=s; //每次循环都累加面积
                }
            }
        }
        return result; //返回岛屿总面积
    }
    
    public static int Dfs(int[,] grid ,int r,int c,int n,int m)
    {
        //如果下标不在范围内 直接返回
        if(r<0 || r>=n ||c<0 ||c>=m)
        {
            return 0;
        }
        if(grid[r,c]!=1)
        {
            return 0;
        }
        //如果在范围内 
        //将当前陆地标记为水 避免重复基数
        grid[r,c]=0; //递归访问四个方向
        return 1+Dfs(grid,r+1,c,n,m)
                +Dfs(grid,r-1,c,n,m)
                +Dfs(grid,r,c+1,n,m)
                +Dfs(grid,r,c-1,n,m);
    }
    
}

标签:firstLine,C#,岛屿,Dfs,int,grid,孤岛
From: https://blog.csdn.net/qq_74014730/article/details/143463921

相关文章

  • 解决QT5升级Creator 14.x后出现launch debugger红色报错问题-OK
       QT5升级QtCreator14.x后出现launchdebugger红色报错,QT5C++项目可以编译运行,但无法调试运行。经试验:选择DesktopQT5.15.2MinGW64-bit调试运行无法启动,红色报错。增加安装QT6.7.3后,选择DesktopQT6.7.3MinGW64-bit可以成功进行调试运行。   经过多次测试,发......
  • Tailwin CSS 基础·中篇
    TailwinCSS基础·中篇方便自己查看,仅做摘录,非原创。原文链接听说你还不会TailwindCSS(基础·上篇)TailwindCSS的基础使用:从宽度高度开始逐步展现Tai-掘金(juejin.cn)听说你还不会TailwindCSS(基础·中篇)TailwindCSS的基础使用:包含伪类、伪元素、flex和-掘金(ju......
  • AtCoder Beginner Contest 378
    ABC378光速切掉前四题,结果倒在了第五题。A-Pairing难度:红。弱智题,不解释。#include<bits/stdc++.h>usingnamespacestd;intmain(){inta[5]={0};for(inti=1;i<=4;i++){intx;cin>>x;a[x]++;}intans=0;for(inti=1;i<=4;i++){......
  • 老鹰抓小鸡C++
    题目描述热热和乎乎等n位小朋友玩老鹰抓小鸡的游戏,狐狸老师当老鹰,排在第一位的小朋友当“母鸡”,其他4小朋友当“小鸡”。但是“母鸡”很辛苦,所以过一段时间“母鸡”需要排到队伍最后成为“小鸡”,让第二位小朋友当“母鸡”······试编一程序,模拟k次位置变化的过程。初始位......
  • 有序数列合并C++
    将两个数列合并为一个数列,并从小到大排序题目描述输入两个升序排列的序列,将两个序列合并为一个有序序列并输出。输入描述输入包含三行,第一行包含两个正整数n,m(1≤n,m≤100),用空格分隔。n表示第二行第一个升序序列中数字的个数,m表示第三行第二个升序序列中数字的个数。......
  • Apache HTTP Sever 的初级操作指南
    Apache初级操作指南摘要:本文详细介绍了ApacheHTTPServer的初级操作方法,包括安装与配置、启动与停止服务、虚拟主机设置以及访问日志与错误日志的查看与分析等内容。通过本文的学习,初学者可以快速掌握Apache的基本操作,为搭建和管理网站奠定基础。一、引言ApacheH......
  • libaom 源码分析:AV1帧内预测 CfL 模式
    CfL预测模式原理从亮度到色度CfL是一种色度帧内预测模式,通过建立共位重建亮度采样的线性函数来模拟色度采样;对于不同的色度采样格式(例如4:2:0和4:2:2),可能需要对重建的亮度像素进行子采样,以匹配色度样本的分辨率;在CfL模式中,从亮度样本中移除直流分量以形成交流(AC)贡献。预测......