给一个01矩阵,1代表是陆地,0代表海洋, 如果两个1相邻,那么这两个1属于同一个岛。我们只考虑上下左右为相邻。
岛屿: 相邻陆地可以组成一个岛屿(相邻:上下左右) 判断岛屿个数。
例如:
输入
[
[1,1,0,0,0],
[0,1,0,1,1],
[0,0,0,1,1],
[0,0,0,0,0],
[0,0,1,1,1]
]
对应的输出为3
package com.wy.搜索;
import java.util.LinkedList;
import java.util.Queue;
/**
* 思路:
* 1.遍历整块大陆,横着竖着遍历都可以
* 2.第一次碰到陆地的时候,就知道这十块岛屿了,所以将这块陆地放入探险队列,岛屿数量加1
* 3.然后我们将这块岛屿的陆地探索完。每一次将这块陆地周围(上下左右)的陆地放入队列,然后将这块陆地标记为已探索(这里就直接置为0了)
* 4.当探险队列为空时,表示这块岛屿的陆地全部被探索完了,我们继续寻找下一块陆地
*
* 解法:
* 1.BFS 使用队列
* 2.DFS 使用栈
* 3.并查集
*/
public class 岛屿数量 {
public int solve(char grid[][]){
if(grid == null || grid.length == 0){
return 0;
}
int nr = grid.length;
int nc = grid[0].length;
int num_land = 0;
for (int i = 0; i < nr; i++) {
for (int j = 0; j < nc; j++) {
if(grid[i][j] == '1'){
num_land++;
// dfs(grid, i, j);
bfs(grid, i, j);
}
}
}
return num_land;
}
//1.DFS
public void dfs(char grid[][], int r, int c){
int nr = grid.length;
int nc = grid[0].length;
if(r < 0 || c < 0 || r >= nr || c >= nc || 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);
}
//2.BFS
public void bfs(char grid[][], int r, int c){
Queue<Integer> queue = new LinkedList<>();
int nr = grid.length;
int nc = grid[0].length;
queue.add(r * nc + c);
grid[r][c] = '0';
while (!queue.isEmpty()){
int index = queue.poll();
r = index / nc;
c = index % nc;
if(r - 1 >= 0 && grid[r - 1][c] == '1'){
grid[r - 1][c] = '0';
queue.add((r - 1) * nc + c);
}
if(r + 1 < nr && grid[r + 1][c] == '1'){
grid[r + 1][c] = '0';
queue.add((r + 1) * nc + c);
}
if(c - 1 >= 0 && grid[r][c - 1] == '1'){
grid[r][c - 1] = '0';
queue.add(r * nc + c - 1);
}
if(c + 1 < nc && grid[r][c + 1] == '1'){
grid[r][c + 1] = '0';
queue.add(r * nc + c + 1);
}
}
}
}