题目
给你一个由 '1'(陆地)和 '0'(水)组成的的二维网格,请你计算网格中岛屿的数量。
岛屿总是被水包围,并且每座岛屿只能由水平方向和/或竖直方向上相邻的陆地连接形成。
此外,你可以假设该网格的四条边均被水包围。
思考
这道题目怎么做?先找到一个数为一,然后再看看他旁边的数是不是一,上下左右,没有了就找下一个一,但是这样子会找到一开始的一,所以我们找到一个岛屿后把他毁掉,变成零,这样子就不会重复计数了,当然这个是字符数组,我们需要注意'1','0',零一应该这样子写
代码
class Solution {
public int numIslands(char[][] grid) {
if (grid == null || grid.length == 0) {
return 0;
}
int numIslands = 0;
int rows = grid.length;
int cols = grid[0].length;
for (int r = 0; r < rows; r++) {
for (int c = 0; c < cols; c++) {
// 当发现一块未被淹没的陆地时
if (grid[r][c] == '1') {
numIslands++; // 发现新岛屿,计数 + 1
dfs(grid, r, c); // 将与该陆地连接的所有陆地全部淹没
}
}
}
return numIslands;
}
private void dfs(char[][] grid, int r, int c) {
int rows = grid.length;
int cols = grid[0].length;
// 1. 递归终止条件:越界 或者 当前位置是水 ('0')
if (r < 0 || c < 0 || r >= rows || c >= cols || grid[r][c] == '0') {
return;
}
// 2. 将当前陆地淹没(标记为 '0'),防止死循环和重复计数
grid[r][c] = '0';
// 3. 向上下左右四个方向递归扩散
dfs(grid, r - 1, c); // 上
dfs(grid, r + 1, c); // 下
dfs(grid, r, c - 1); // 左
dfs(grid, r, c + 1); // 右
}
}
