岛屿数量 广搜版BFS C#

和之前的卡码网深搜版是一道题 力扣第200题

  1. 岛屿数量
题目描述

给定一个由 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

思路:广度优先搜索:如果一个位置为 1,则将其加入队列,开始进行广度优先搜索。在广度优先搜索的过程中,每个搜索到的 1 都会被重新标记为 0。直到队列为空,搜索结束。最终岛屿的数量就是我们进行广度优先搜索的次数

BFs比Dfs简单点的就是不需要Dfs深搜函数 直接在一个大循环中新建队列就可以利用队列进行搜索值为1的位置并且更改其值为0

注意:1.Queue<int[]> 存储的是 一维数组 (int[]),每个 int[] 存储的是一个位置的坐标(例如,二维数组中的行和列)

假设二维数组 grid 长这样:

grid = { {'1', '0', '1'}, {'0', '1', '0'}, {'1', '0', '1'} }

遍历数组后,存储到队列中的内容会是:

queue = { {0, 1}, {1, 0}, {1, 2}, {2, 1} }

每个队列元素是一个 int[] 数组,例如 {0, 1},表示二维数组 grid 中的位置 (0, 1),即 grid[0][1] 的值是 '0'

Queue也可以在外边声明也可以在if语句中声明

2.将 Queue 的声明移到 if 语句内部的好处是:

  1. 每次发现新的岛屿时,您都会创建一个新的队列,这样就不会重用先前岛屿的队列。
  2. 这样也可以让 queue 仅在岛屿查找过程中存在,避免了不必要的内存占用。

代码实现:

using System;

System.Collections.Generic

class Program

{

static void Main()

{

//读取输入

string\[\] firstLine=Console.ReadLine().Split();//读取一行输入并将其分割成一个字符串数组

int n=int.Parse(firstLine0);

int m=int.Parse(firstLine1);

//填充岛屿

int, grid=new intn,m;

for(int i=0;i<n;i++)

{

firstLine=Console.ReadLine().Split();

for(int j=0;j<m;j++) //填充每一行

{

gridi,j=int.Parse(firstLinej);

}

}

//计算岛屿数量

int Count=CountIsland(grid,n,m);

Console.WriteLine(Count);

}

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(gridi,j==1)

{

count++;

gridi,j=0;

Queue<int\[\]> queue=new Queue<int\[\]>();

queue.Enqueue(new int\[\]{i,j});//将坐标入队

while(queue.Count>0)

{

int\[\] tmp=queue.Dequeue();

int r=tmp0;

int c=tmp1;

//判断该坐标四周

if(r-1>=0 && gridr-1,c==1)

{

queue.Enqueue(new int\[\]{r-1,c});

gridr-1,c=0;

}

if(r+1<n && gridr+1,c==1)

{

queue.Enqueue(new int\[\]{r+1,c});

gridr+1,c=0;

}

if(c-1>=0 && gridr,c-1==1)

{

queue.Enqueue(new int\[\]{r,c-1});

gridr,c-1=0;

}

if(c+1<m && gridr,c+1==1)

{

queue.Enqueue(new int\[\]{r,c+1});

gridr,c+1=0;

}

}

}

}

}

return count; //返回岛屿数量

}

}

相关推荐
学习论之费曼学习法7 小时前
无人值守AI内容矩阵实战(8):标题 A/B 实验的 6 个工程实现细节,隔日对比与自动判胜
人工智能·python·算法·矩阵·自动化·a/b测试·内容矩阵
Carl_奕然7 小时前
【机器视觉】最强算法之:3D高斯泼溅(3D Gaussian Splatting)
人工智能·python·算法·目标检测·计算机视觉·3d
w_zero_one7 小时前
算法--桶思想
java·开发语言·算法
wordbaby8 小时前
同一次请求里的两道锁:图解搞懂国密 SM2 与 SM3
算法
miller-tsunami9 小时前
内存管理&模板
c++·算法·内存管理·模板
青少儿编程课堂9 小时前
蓝桥杯青少组·全国青少年信息素养·电子学会Scratch考级:校园智能抢答器项目解析
c++·python·算法·bfs·信息学竞赛
SZYSK9 小时前
一套人员主数据,三套事务:通行、消费、人证比对如何分事件类型
物联网·算法·harmonyos
怕浪猫10 小时前
不用摄像机,我把历史故事做成竖屏视频
算法·面试·github
从小白到软工10 小时前
5-2 从查表到控件:造按钮
c语言·开发语言·数据结构·经验分享·ai编程
郝学胜-神的一滴11 小时前
AI 编程智能体 16:从零基础搭建到精细化优化
人工智能·python·算法·语言模型·langchain·pip