200. 岛屿的个数
给定一个由 ‘1’(陆地)和 ‘0’(水)组成的的二维网格,计算岛屿的数量。一个岛被水包围,并且它是通过水平方向或垂直方向上相邻的陆地连接而成的。你可以假设网格的四个边均被水包围。
Example 1
输入:
11110
11010
11000
00000
输出: 1
Example 2
输入:
11000
11000
00100
00011
输出: 3
思路
- 广度优先搜索
- 循环遍历每个点,如果该点是0,则跳过,如果是1,岛屿数目加1,并加入队列,并将该点改为0,避免重复访问,然后进行广搜,取出队首元素,搜索该点周围四个点,如果有1就加入队列,并将1改为0,否则就跳过,当队列空时,一块岛屿搜索完毕,进入下一块搜索,如此下去。。。
- 搜索时注意数组是否越界
static auto x = []() {
std::ios::sync_with_stdio(false);
std::cin.tie(NULL);
return 0;
}();
class Solution {
private:
const int dis[4][2]={0,1,1,0,0,-1,-1,0};
int k; //记录岛屿个数
pair<int,int> s; //保存队首元素坐标
pair<int,int> sl; //保存新点坐标
queue<pair<int,int>> q;
public:
int numIslands(vector<vector<char>>& grid) {
k=0;
for(int i=0;i<grid.size();i++)
{
for(int j=0;j<grid[i].size();j++)
{
if(grid[i][j]=='0') continue;
if(grid[i][j]=='1')
{
k++;
grid[i][j]='0';
s.first = i;
s.second = j;
q.push(s);
while(!q.empty())
{
s=q.front();
q.pop();
for(int m=0;m<4;m++)
{
int dx = s.first+dis[m][0];
int dy = s.second+dis[m][1];
if(dx<0 || dx>=grid.size() || dy<0 ||dy>=grid[i].size()) continue;
if(grid[dx][dy] == '1')
{
sl.first = dx;
sl.second = dy;
q.push(sl);
grid[dx][dy]='0';
}
}
}
}
}
}
return k;
}
};
深度优先搜索
int dis[4][2]={0,1,1,0,0,-1,-1,0};
void dfs(char** grid,int w,int l,int x,int y)
{
for(int i=0;i<4;i++)
{
int dx = x+dis[i][0];
int dy = y+dis[i][1];
if(dx<0||dx>=w||dy<0||dy>=l||grid[dx][dy]=='0') continue;
grid[dx][dy]='0';
dfs(grid,w,l,dx,dy);
}
}
int numIslands(char** grid, int gridRowSize, int gridColSize) {
int res=0;
for(int i=0;i<gridRowSize;i++)
{
for(int j=0;j<gridColSize;j++)
{
if(grid[i][j]=='1')
{
res++;
grid[i][j]='0';
dfs(grid,gridRowSize,gridColSize,i,j);
}
}
}
return res;
}