給定一個由 '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;
}