卡码网 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);
}
}