岛屿的最大面积(深搜

卡码网 

100. 岛屿的最大面积

题目描述

给定一个由 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
输出示例
4
提示信息

样例输入中,岛屿的最大面积为 4。

数据范围:

1 <= M, N <= 50。

思路:大体思路和岛屿的最大数量一致 都是先入录文本 再进行计算 区别是

  //让每次深搜到一个1值后都加1 就代表增加一个1的面积 四个方向加到一起就是一个岛的总面积

        return 1+Dfs(grid,r,c+1) +Dfs(grid,r,c-1)+Dfs(grid,r+1,c)+Dfs(grid,r-1,c);

在return时需要加1 代表每次搜到后增加1面积 

并且在int a=Dfs(grid,i,j);

 result=Math.Max(result,a); //取每次遍历到的最大的面积数 

Dfs的返回值需要变为int 类型的 并且拿一个a去承载 在每次外层循环中取最大的a值 

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 =CountIsland(grid,n,m);
        Console.WriteLine(SumLand);
    }
    //遍历整个数组 寻找含1的位置
    public static int CountIsland(int[,]grid ,int n,int 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=Math.Max(s,result); //每次外层循环都计算最大面积
                }
            }
        }
        return result; //返回岛屿最大面积
    }
    
    public 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);
    }
    
}

计算二维网格中最大岛屿面积通常使用深度优先索(DFS)来实现。具体来说,遍历整个网格,每当遇到值为 `1` 的格子时,就从该格子出发进行 DFS 索,统计与其相连的所有陆地格子数量,即为当前岛屿面积。在这一过程中,为了防止重复访问同一块土地,可以将已经访问过的陆地标记为 `0`。 ### 算法步骤 - 遍历整个网格。 - 当发现值为 `1` 的格子时,启动 DFS 计算该岛屿面积。 - 在 DFS 过程中,每访问一个格子,将其标记为 `0` 以避免重复计算。 - 维护一个变量记录所有岛屿中的最大面积。 ### 实现代码 ```python def maxAreaOfIsland(grid): def dfs(i, j): # 如果越界或当前格子不是陆地,则返回0 if i < 0 or i >= len(grid) or j < 0 or j >= len(grid[0]) or grid[i][j] == 0: return 0 # 将当前格子标记为已访问 grid[i][j] = 0 # 计算当前岛屿面积,包括自身和上下左右四个方向的土地 area = 1 + dfs(i+1, j) + dfs(i-1, j) + dfs(i, j+1) + dfs(i, j-1) return area max_area = 0 for i in range(len(grid)): for j in range(len(grid[0])): if grid[i][j] == 1: # 对每一个未被访问的岛屿进行DFS,并更新最大面积 max_area = max(max_area, dfs(i, j)) return max_area ``` ### 示例输入输出 假设有一个如下的二维网格: ```python grid = [ [0,0,1,0,0,0,0,1,0,0,0,0,0], [0,0,0,0,0,0,0,1,1,1,0,0,0], [0,1,1,0,1,0,0,0,0,0,0,0,0], [0,1,0,0,1,1,0,0,1,0,1,0,0], [0,1,0,0,1,1,0,0,1,1,1,0,0], [0,0,0,0,0,0,0,0,0,0,1,0,0], [0,0,0,0,0,0,0,1,1,1,0,0,0], [0,0,0,0,0,0,0,1,1,0,0,0,0] ] ``` 调用 `maxAreaOfIsland(grid)` 将会返回 `6`,表示最大岛屿由 6 块陆地组成[^4]。 ### 复杂度分析 - **时间复杂度**:O(m*n),其中 m 和 n 分别是网格的行数和列数。每个格子最多只会被访问一次。 - **空间复杂度**:O(m*n),最坏情况下,递归调用栈的度可能达到 m*n,例如当整个网格是一个大的岛屿时。 这种方法不仅适用于求解最大岛屿面积的问题,还可以通过调整 DFS 函数来解决其他相关问题,比如岛屿的数量、岛屿的周长等。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值