给定一个由 '1'(陆地)和 '0'(水)组成的的二维网格,计算岛屿的数量。一个岛被水包围,并且它是通过水平方向或垂直方向上相邻的陆地连接而成的。你可以假设网格的四个边均被水包围。
示例 1:
输入:
11110
11010
11000
00000
输出: 1
示例 2:
输入:
11000
11000
00100
00011
输出: 3
思路:两种方法DFS和BFS
void BFS(vector<vector<char>>&mark,vector<vector<char>>&grid,int x,int y){
static const int dx[]={-1,1,0,0};
static const int dy[]={0,0,-1,1};
queue<pair<int,int>> Q;
Q.push(make_pair(x,y));
mark[x][y]=1;
while(!Q.empty()){
x=Q.front().first;
y=Q.front().second;
Q.pop();
for(int i=0;i<4;i++){
int newx=dx[i]+x;
int newy=dy[i]+y;
if(newx<0||newx>=mark.size()||newy<0||newy>=mark[newx].size()){
continue;
}
if(mark[newx][newy]==0&&grid[newx][newy]==1){
Q.push(make_pair(newx,newy));
mark[newx][newy]=1;
}
}
}
}
void DFS(vector<vector<char>>&mark,vector<vector<char>>&grid,int x,int y){
mark[x][y]='1';
static const int dx[]={-1,1,0,0};
static const int dy[]={0,0,1,-1};
for(int i=0;i<4;i++){
int newx=x+dx[i];
int newy=y+dy[i];
if(newx<0||newx>=mark.size()||newy<0||newy>=mark.size()){
continue;
}
if(grid[newx][newy]=='1'&&mark[newx][newy]=='0'){
DFS(mark,grid,newx,newy);
}
}
}
int numIslands(vector<vector<char>>& grid) {
vector<vector<char>> mark;
int block=0;
for(int i=0;i<grid.size();i++){
mark.push_back(vector<char>());
for(int j=0;j<grid[i].size();j++){
mark[i].push_back('0');
}
}
for(int i=0;i<grid.size();i++){
for(int j=0;j<grid[0].size();j++){
if(grid[i][j]=='1'&&mark[i][j]=='0'){
DFS(mark,grid,i,j);
block++;
}
}
}
return block;
}