1.较为初级的解法(DFS)
遍历地图上的所有格子,如果遇到 ‘1’ (陆地),则把这个 ‘1’(陆地)及其连通的 ‘1’(陆地)(这是一个递归的过程,只要还存在连通的 ‘1’ ,就一直炸) 全部变为 0,也就是采取沉岛策略,遇到一个陆地,就顺着陆地找出整个岛,把岛沉掉,一整个岛炸完了,就计数+ 1,最后返回总的计数即可。
//代码取自题解中Krahets的解法
//92% 83%
public int numIslands(char[][] grid) {
int isLands = 0;
for(int i = 0; i < grid.length; i++) {
for(int j = 0; j < grid[0].length; j++) {
if(grid[i][j] == '1'){//如果这是陆地
dfs(grid, i, j);//就顺着这个陆地,把整个岛炸掉
isLands++;//炸一个岛,记一次数
}
}
}
return isLands;
}
private void dfs(char[][] grid, int i, int j){
//越界终止条件
if(i < 0 || j < 0 || i >= grid.length || j >= grid[0].length || grid[i][j] == '0') return;
grid[i][j] = '0';//炸掉这个陆地
//以(i, j)为中心,四处漫延
dfs(grid, i - 1, j);//上
dfs(grid, i + 1, j);//下
dfs(grid, i, j - 1);//左
dfs(grid, i, j + 1);//右
}