给你一个由 '1'(陆地)和 '0'(水)组成的的二维网格,请你计算网格中岛屿的数量。
岛屿总是被水包围,并且每座岛屿只能由水平方向和/或竖直方向上相邻的陆地连接形成。
此外,你可以假设该网格的四条边均被水包围。
示例 1:
输入:grid = [
["1","1","1","1","0"],
["1","1","0","1","0"],
["1","1","0","0","0"],
["0","0","0","0","0"]
]
输出:1
示例 2:
输入:grid = [
["1","1","0","0","0"],
["1","1","0","0","0"],
["0","0","1","0","0"],
["0","0","0","1","1"]
]
输出:3
思路:本题的要求是求有多少个岛屿,字符‘1’表示陆地,上下左右相邻的陆地是同一块岛屿,因此求解该题的方法就是遍历该二维数组,一旦遇到‘1’,就以这块陆地为基准,通过宽度搜索方法,把所有相邻的陆地都找出来,这就是一个岛屿记录下来,为了防止重复搜索,每次找到陆地后都将其值从‘1’变为‘0’。
在本题中通过宽度搜索方法求解需要用队列queue进行临时存储遍历数组遇到的第一个陆地‘1’,通过while循环,每次将队列中的大陆取出,将其值改为'0',并判断其上下左右是否有相邻的陆地,有则插入队列中。知道队列为空时退出循环,继续遍历二维数组。
代码如下:
class Solution {
public:
struct position{//用于记录陆地位置的结构体
int a,b;
};
int numIslands(vector<vector<char>>& grid) {
int n=grid.size(),m=grid[0].size();//记录二维数组有几行几列
int x[]={-1,1,0,0};//这两个数组是用来移动陆地查看其上下左右是否有陆地
int y[]={0,0,-1,1};
int number=0;//用于记录岛屿个数
queue<position> que;//用于宽度搜索
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
if(grid[i][j]=='0'){//若遍历的不是陆地则结束本次循环进入下一次循环
continue;
}
else{
que.push({i,j});//若是陆地则向队列中插入该陆地的位置
number++;//岛屿数量加一
grid[i][j]='0';//将该值改为'0',防止重复记录
while(!que.empty()){//进行宽度搜索
position temp=que.front();//取出陆地位置
que.pop();
for(int k=0;k<4;k++){//查看该陆地位置上下左右四个方向上是否有相邻的位置
int x1=temp.a+x[k];
int y1=temp.b+y[k];
if(x1<0||x1>=n||y1<0||y1>=m){//判断是否越界
continue;
}
if(grid[x1][y1]=='0'){//判断是否是陆地
continue;
}
else{
grid[x1][y1]='0';
que.push({x1,y1});
}
}
}
}
}
}
return number;
}
};
标签:陆地,200,int,岛屿,grid,数组,y1,数量
From: https://blog.csdn.net/2401_84164461/article/details/144141789