题目
给一个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
(注:存储的01数据其实是字符'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
示例2
输入:[[0]]
返回值:0
示例3
输入:[[1,1],[1,1]]
返回值:1
备注:01矩阵范围<=200*200
思路
遍历数组中的每一个值:
- 每个位置如果是1,说明这两个岛屿是连着的,只能算是一个岛屿,先要把它置为0,然后沿着它的上下左右4个方向继续遍历,执行同样的操作。
- 如果是0,就说明不是岛屿,就不在往它的上下左右4个位置遍历了。
代码
import java.util.*;
public class Solution {
/**
* 判断岛屿数量
* @param grid char字符型二维数组
* @return int整型
*/
public int solve (char[][] grid) {
int m = grid.length;
if (m == 0) {
return 0;
}
int n = grid[0].length;
//统计岛屿的个数
int res = 0;
//将岛屿及其周围全部置0
//两个for循环遍历每一个格子
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
//只有当前格子是1才开始计算
if (grid[i][j] == '1') {
//如果当前格子是1,岛屿的数量加1
res++;
//用dfs搜索周围所有的1,通过dfs把当前格子的上下左右4个位置为1的都要置为0,因为它们是连着一起的算一个岛屿
dfs(grid, i, j, m, n);
}
}
}
//最后返回岛屿的数量
return res;
}
//把当前格子以及其邻近的为1的格子都会置为0
public void dfs(char[][] grid, int i, int j, int m, int n) {
//边界条件判断,不能越界
if (i < 0 || i >= m || j < 0 || j >= n || grid[i][j] == '0') {
return;
}
//把当前格子置为0,然后再从他的上下左右4个方向继续遍历
grid[i][j] = '0';
dfs(grid, i - 1, j, m, n);//上
dfs(grid, i + 1, j, m, n);//下
dfs(grid, i, j + 1, m, n);//左
dfs(grid, i, j - 1, m, n);//右
}
}