卡码网 C#版
99. 岛屿数量
题目描述
给定一个由 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
输出示例
3
提示信息
根据测试案例中所展示,岛屿数量共有 3 个,所以输出 3。
数据范围:
1 <= N, M <= 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[,] 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 Count=CountIsland(grid,n,m);
Console.WriteLine(Count);
}
//遍历整个数组 寻找含1的位置
public int CountIsland(int[,]grid ,int n,int m)
{
int count=0;
for(int i=0;i<n;i++)
{
for(int j=0;j<m;j++)
{
if(grid[i,j]==1)
{
count++;
Dfs(grid,i,j,n,m);
}
}
}
return count; //返回岛屿数量
}
public void Dfs(int[,] grid ,int r,int c,int n,int m)
{
//如果下标不在范围内 直接返回
if(r<0 || r>=n ||c<0 ||c>=m)
{
return ;
}
if(grid[i,j]!=1){
return ;
}
//如果在范围内
//将当前陆地标记为水 避免重复基数
grid[r,c]=0;
//递归访问四个方向
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);
}
}