题目
思路
1是陆地,0是海洋,如果陆地的上下左右是相连的,只算作1块陆地。循环遍历网格,发现陆地计数就+1,在遍历下一个网格之前,先把跟该网格相关联的陆地置为0(击沉)。
可以用深度优先搜索递归实现。
代码
private static int sinkingIslandNum(int[][] grid) {
int r = grid.length;
int c = grid[0].length;
int num = 0;
for (int i = 0; i < r; i++) {
for (int j = 0; j < c; j++) {
//遍历每一个方格
if (grid[i][j] == 1) {
//发现一个陆地
num++;
//击沉
dfs(grid, i, j);
}
}
}
return num;
}
private static void dfs(int[][] grid, int r, int c) {
if (r < 0 || c < 0
|| r >= grid.length || c >= grid[0].length
|| grid[r][c] == 0) {
return;
}
grid[r][c] = 0;
//顺藤摸瓜 全部击沉
dfs(grid, r - 1, c);
dfs(grid, r + 1, c);
dfs(grid, r, c - 1);
dfs(grid, r, c + 1);
}