岛屿数量
给你一个由 ‘1’(陆地)和 ‘0’(水)组成的的二维网格,请你计算网格中岛屿的数量。
岛屿总是被水包围,并且每座岛屿只能由水平方向或竖直方向上相邻的陆地连接形成。
此外,你可以假设该网格的四条边均被水包围。
示例1:
输入:
[
['1','1','1','1','0'],
['1','1','0','1','0'],
['1','1','0','0','0'],
['0','0','0','0','0']
]
输出: 1
示例2:
输入:
[
['1','1','0','0','0'],
['1','1','0','0','0'],
['0','0','1','0','0'],
['0','0','0','1','1']
]
输出: 3
解释: 每座岛屿只能由水平和/或竖直方向上相邻的陆地连接而成。
官方题解:
class Solution {
public:
int numIslands(vector<vector<char>>& grid) {
int island=0;//初始化岛屿数量
int r=grid.size();//第一维数组的大小
if(!r) return 0;//数组为空返回0
int c=grid[0].size();//第二维数组的大小
for(int i=0;i<r;i++)//遍历数组
{
for(int j=0;j<c;j++)
{
if(grid[i][j]=='1')//当前值为‘1’
{
island++;
grid[i][j]='0';//把当前值标记为‘0’
queue<pair<int,int>> q;//创建一个队列
q.push({i,j});//把当前值推入队列
while (!q.empty())//广度优先搜索
{
auto value=q.front();//存取队列队首值
q.pop();//弹出队首值
int row=value.first,col=value.second;//记录此值的一维和二维下标值
if(row-1>=0&&grid[row-1][col]=='1')/*以当前值为根节点,
进行上、下、左、右节点的搜索,
如果为‘1’则标记为‘0’并压入队列,
直到队列为空*/
{
q.push({row-1,col});
grid[row-1][col]='0';
}
if(row+1<r&&grid[row+1][col]=='1')
{
q.push({row+1,col});
grid[row+1][col]='0';
}
if(col-1>=0&&grid[row][col-1]=='1')
{
q.push({row,col-1});
grid[row][col-1]='0';
}
if(col+1<c&&grid[row][col+1]=='1')
{
q.push({row,col+1});
grid[row][col+1]='0';
}
}
}
}
}
return island;
}
};