1、题目描述
2、解题思路
从左到右,从上到下遍历网格,当遇到一个 1 时,则岛的数量加一,对这个点进行 DFS
DFS 的细节如下:
1、判断当前点是不是超出网格边界或者根本不为 1,若是,则 return;
2、把当前点设置为 0,这样下一次访问到这个点就不会重复计算;
3、对这个点的上、下、左、右依次进行 DFS。
3、解题代码
class Solution {
public int numIslands(char[][] grid) {
if (grid == null || grid.length == 0) {
return 0;
}
int nr = grid.length; // 网格的行数
int nc = grid[0].length; // 网格的列数
int num_islands = 0; // 岛的数量
for (int r = 0; r < nr; ++r) { // 遍历所有行
for (int c = 0; c < nc; ++c) { // 遍历所有列
if (grid[r][c] == '1') { // 如果该点为 1 则进行 dfs 把和它连一块的区域全部置 0
++num_islands;
dfs(grid, r, c);
}
}
}
return num_islands;
}
void dfs(char[][] grid, int r, int c) {
int nr = grid.length;
int nc = grid[0].length;
// 如果当前坐标点超出网格或者它不是岛,则 return
if (r < 0 || c < 0 || r >= nr || c >= nc || grid[r][c] == '0') {
return;
}
// 把这个点变为 0 ,下次就不会扫描到它
grid[r][c] = '0';
// 接着 dfs 这个点的上下左右
dfs(grid, r - 1, c);
dfs(grid, r + 1, c);
dfs(grid, r, c - 1);
dfs(grid, r, c + 1);
}
}