1.题目描述
2.思路
(1)主函数,存储图结构
(2)主函数,visit数组表示已访问过的元素
(3)辅助函数,用递归(深搜),遍历以已访问过的元素(陆地1)的相邻元素(陆地1)。
补充:深度搜索(递归)
(1)确定递归函数和参数
(2)确定终止条件
(3)单层搜索条件
3.代码实现
public int numIslands(char[][] grid) {
//行数
int row = grid.length;
//列数
int col = grid[0].length;
// visited 用于记录访问状态
boolean[][] visited = new boolean[row][col];//所有数组的元素在创建时都会被自动初始化为默认值。
//岛屿数量初始化
int cnt = 0;
//判空处理,整个图为null,行为0,列为0
if (row == 0 || col == 0 || grid == null) {
return 0;
}
//存储图结构
for (int i = 0; i < row; i++) {
for (int j = 0; j < col; j++) { // 如果当前是陆地且未被访问
if (grid[i][j] == '1' && visited[i][j] == false)
//!visited[i][j] 和visited[i][j]==false 等同
{
cnt++;
dfs(grid, visited, i, j);// 每次DFS表示一个岛屿
}
}
}
return cnt;
}
// 深度优先搜索,将与当前位置相连的陆地都标记为已访问
void dfs(char[][] grid, boolean visited[][], int i, int j) {
int row = grid.length;
int col = grid[0].length;
// 越界或不是陆地或已访问,直接返回,切记因为索引是从0开始的,所以i>=row||j>=col
if (i < 0 || j < 0 || i >= row || j >= col || visited[i][j] == true || grid[i][j] == '0') {
return;
}
// 标记为已访问,把访问过的陆地的相邻陆地标记为已访问过
visited[i][j] = true;
dfs(grid, visited, i + 1, j);
dfs(grid, visited, i - 1, j);
dfs(grid, visited, i, j + 1);
dfs(grid, visited, i, j - 1);
}
public static void main(String[] args) {
H200 test = new H200();
char[][] input = {
{'1', '1', '1', '1', '0'},
{'1', '1', '0', '1', '0'},
{'1', '1', '0', '0', '0'},
{'0', '0', '0', '0', '0'}
};
int numsIsland = test.numIslands(input);
System.out.print(numsIsland);
}