沉没孤岛(Dfs ACM模式

卡码网  102 题  在力扣没找到相似的  和孤岛总面积思路一致

102. 沉没孤岛

题目描述

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

现在你需要将所有孤岛“沉没”,即将孤岛中的所有陆地单元格(1)转变为水域单元格(0)。

输入描述

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

之后 N 行,每行包含 M 个数字,数字为 1 或者 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 0 0 0
1 1 0 0 0
0 0 0 0 0
0 0 0 1 1
提示信息

将孤岛沉没。

数据范围:

1 <= M, N <= 50。

思路:和之前的找孤岛总面积是 一个意思 都是先得 把四周的先全深搜了 ,然后标识改为2 ,现在图中剩下的1 就是孤岛了 本题没让求面积 所以直接在第二次遍历图时遇见2 就让2 变为1 遇见1 直接变为0即可 不需要再定义另一个深搜去处理第二次遇见1 的逻辑

 注意点: Console.Write(grid[i,j]," "); 输出的时候 后边的双引号打上空格才能让输出的每个数后边空一格  并且要在外部循环加上换行Console.WriteLine();

using System;

class Program
{
    public static int n;
    public static int m;
    static void Main()
    {
        string[] inputs=Console.ReadLine().Split();       
         n=int.Prase(inputs[0]);
         m=int.Parse(inputs[1]);
        
        // 声明数组 填充输入数组
        int[,] grid=new int [n,m];
        for(int i=0;i<n;i++)
        {
            inputs=Console.ReadLine().Split();
            for(int j=0;j<m;j++)
            {
                grid[i,j]=int.Parse(inputs[j]);
            }
        }
        CountIsLand(grid,n,m);
        
    }
    public static void  CountIsLand(int[,] grid ,int n,int m)
    {
        //先识别四边的岛屿 Dfs遍历 使之更改标识为2 
        //识别左右 
        for(int i=0;i<n;i++)
        {
            if(grid[i,0]==1)
            {
                Dfs(grid,i,0);
            }
            if(grid[i,m-1]==1)
            {
                Dfs(grid,i,m-1);
            }
        }
        //识别上下行
        for(int j=0;j<m;j++)
        {
            if(grid[0,j]==1)
            {
                Dfs(grid,0,j);
            }
            if(grid[n-1,j]==1)
            {
                Dfs(grid,n-1,j);
            }
        }
        
        //改标识完毕 重新扫描图
        for(int i=0;i<n;i++)
        {
            for(int j=0;j<m;j++)
            {
                if(grid[i,j]==1) //如果检测到1证明是孤岛 变为0即可
                {
                    grid[i,j]=0;
                }
                if(grid[i,j]==2) //检测到 2 证明是被清理的岛 再还原为1 即可
                {
                    grid[i,j]=1;
                }
            }
        }
        //输出
        for(int i=0;i<n;i++)
        {
            for(int j=0;j<m;j++)
            {
                Console.Write(grid[i,j]," ");
            }
            Console.WriteLine();//打印换行
        }
        
    }
    public static void Dfs(int[,] grid ,int r,int c)
    {
        if(r<0 ||r >=n ||c<0||c>=m)
        {
            return ;
        }
        if(grid[r,c]!=1)
        {
            return ;
        }
        grid[r,c]=2;
        Dfs(grid,r,c+1);
        Dfs(grid,r,c-1);
        Dfs(grid,r+1,c);
        Dfs(grid,r-1,c);
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值