https://leetcode-cn.com/problems/number-of-islands/solution/dao-yu-shu-liang-by-leetcode/
图解:DFS + BFS + 并查集(Python 代码、Java 代码)
DFS
class Solution {
public:
void dfs(vector<vector<char>>& grid,int r,int c){
int nr=grid.size();
int nc=grid[0].size();
grid[r][c]='0';
if(r-1>=0&&grid[r-1][c]=='1') dfs(grid,r-1,c);
if(r+1<nr&&grid[r+1][c]=='1') dfs(grid,r+1,c);
if(c-1>=0&&grid[r][c-1]=='1') dfs(grid,r,c-1);
if(c+1<nc&&grid[r][c+1]=='1') dfs(grid,r,c+1);
}
int numIslands(vector<vector<char>>& grid) {
int nr=grid.size();
if(!nr) return 0;
int nc=grid[0].size();
int num_islands=0;
for(int r=0;r<nr;r++){
for(int c=0;c<nc;c++){
if(grid[r][c]=='1'){
++num_islands;
dfs(grid,r,c);
}
}
}
return num_islands;
}
};
BFS
class Solution {
public:
int numIslands(vector<vector<char>>& grid) {
int nr=grid.size();
if(!nr) return 0;
int nc=grid[0].size();
int num_islands=0;
for(int r=0;r<nr;r++){
for(int c=0;c<nc;c++){
if(grid[r][c]=='1'){
++num_islands;
queue<pair<int, int>> neighbors;
neighbors.push({r, c});
while (!neighbors.empty()) {
auto rc = neighbors.front();
neighbors.pop();
int row = rc.first, col = rc.second;
if (row - 1 >= 0 && grid[row-1][col] == '1') {
neighbors.push({row-1, col});
grid[row-1][col] = '0';
}
if (row + 1 < nr && grid[row+1][col] == '1') {
neighbors.push({row+1, col});
grid[row+1][col] = '0';
}
if (col - 1 >= 0 && grid[row][col-1] == '1') {
neighbors.push({row, col-1});
grid[row][col-1] = '0';
}
if (col + 1 < nc && grid[row][col+1] == '1') {
neighbors.push({row, col+1});
grid[row][col+1] = '0';
}
}
}
}
}
return num_islands;
}
};