题目
一、思路
- 利用双重循环进行遍历
- 对于为’1’的格子,需要对岛屿数量加1,然后再对其上下左右进行遍历,并将其置为’0’,找出所有当前格子可到达的格子。
- 最终获取岛屿数量。
二、解答
import java.util.*;
public class Solution {
/**
* 判断岛屿数量
* @param grid char字符型二维数组
* @return int整型
*/
public int solve(char[][] grid) {
//边界条件判断
if (grid == null || grid.length == 0) return 0;
//统计岛屿的个数
int count = 0;
//两个for循环遍历每一个格子
for (int i = 0; i < grid.length; i++)
for (int j = 0; j < grid[0].length; j++) {
//只有当前格子是1才开始计算
if (grid[i][j] == '1') {
//如果当前格子是1,岛屿的数量加1
count++;
//然后通过dfs把当前格子的上下左右4
//个位置为1的都要置为0,因为他们是连着
//一起的算一个岛屿,
dfs(grid, i, j);
}
}
//最后返回岛屿的数量
return count;
}
//这个方***把当前格子以及他邻近的为1的格子都会置为1
public void dfs(char[][] grid, int i, int j) {
//边界条件判断,不能越界
if (i < 0 || i >= grid.length || j < 0 || j >= grid[0].length || grid[i][j] == '0')
return;
//把当前格子置为0,然后再从他的上下左右4个方向继续遍历
grid[i][j] = '0';
dfs(grid, i - 1, j);//上
dfs(grid, i + 1, j);//下
dfs(grid, i, j + 1);//左
dfs(grid, i, j - 1);//右
}
}