岛屿的周长 (Dfs法与 普通if判断法

卡码网    只给了普通解法  去力扣学习发现两种解法  一种是Dfs

另一种是纯粹的遍历每个格子的上下左右判断是不是超出边界或者是海水 是的话就 让边数加加

106. 岛屿的周长

题目描述

给定一个由 1(陆地)和 0(水)组成的矩阵,岛屿是被水包围,并且通过水平方向或垂直方向上相邻的陆地连接而成的。

你可以假设矩阵外均被水包围。在矩阵中恰好拥有一个岛屿,假设组成岛屿的陆地边长都为 1,请计算岛屿的周长。岛屿内部没有水域。

输入描述

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

输出描述

输出一个整数,表示岛屿的周长。

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

岛屿的周长为 14。

数据范围:

1 <= M, N <= 50。

 解法一 普通判断解法

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]);
            }
        }
        
        for(int i=0;i<n;i++)
        {
            for(int j=0;j<m;j++)
            {
                if(grid[i,j]==1)
                {
                    if(i-1<0 || grid[i-1,j]==0) //如果此位置的上方超出边界 或者 为0 那么让边加一
                    {
                        result++;
                    }
                    if(i+1>=n || grid[i+1,j]==0)//如果此位置的下方超出边界 或者 为0 那么让边加一
                    {
                        result++;
                    }
                    if(j-1<0 ||grid [i,j-1]==0)//如果此位置的左方超出边界 或者 为0 那么让边加一
                    {
                        result++;
                    }
                    if(j+1>=m ||grid [i,j+1]==0)//如果此位置的右方超出边界 或者 为0 那么让边加一
                    {
                        result++;
                    }
                }
            }
        }
        Console.WriteLine(result);
        
    }
    
}

解法二 DFs Dfs法 要在返回值做文章  ,dfs 函数直接返回有这几种情况:

!inArea(grid, r, c),即坐标 (r, c) 超出了网格的范围,此情况证明该网格挨着一个图的边 对应边加一

grid[r][c] != 1,即当前格子不是岛屿格子,这又分为两种情况:1.grid[r][c] == 0,当前格子是海洋格子 对应边加一         2.grid[r][c] == 2,当前格子是已遍历的陆地格子 没有用 直接返回0

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]);
            }
        }
        
        for(int i=0;i<n;i++)
        {
            for(int j=0;j<m;j++)
            {
                if(grid[i,j]==1)
                {
                    result=Dfs(grid,i,j);
                }
            }
        }
        Console.WriteLine(result);
        
    }
    public int Dfs(int[,] grid ,int r,int c)
    {
        if(r<0 || r>=n || c<0 ||c>=m) //检测到出边界了 证明这个位置和边界相连返回1 
        {
            return 1;
        }
        if(grid[r,c]==0) //检测到当前位置是海洋位置 给前一个遍历到这个位置的陆地值加1 
        {
            return 1;
        }
        if(grid[r,c] ==2) //检测到已经便利过的地方 不做操作 
        {
            return 0;
        }
        grid[r,c]=2;
        return Dfs(grid,r+1,c)+Dfs(grid,r-1,c)+Dfs(grid,r,c+1)+Dfs(grid,r,c-1);

    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值