题目描述:给你一个由 (陆地)和 (水)组成的的二维网格,请你计算网格中岛屿的数量。‘1’ , ‘0’ 岛屿总是被水包围,并且每座岛屿只能由水平方向和/或竖直方向上相邻的陆地连接形成。 此外,你可以假设该网格的四条边均被水包围。
算法思想:
获得更多?算法思路:代码文档,算法解析的私得。
运行效果
完整代码
/**
* 2 * @Author: LJJ
* 3 * @Date: 2023/8/8 13:28
* 4
*/
public class NumberOfIslands {
// 计算岛屿数量的函数
public int numIslands(char[][] grid){
if (grid == null || grid.length == 0 || grid[0].length == 0){
return 0;
}
int rows = grid.length;
int cols = grid[0].length;
int numberOfIslands = 0;
for (int i = 0; i < rows; i++){
for (int j = 0; j < cols; j++){
// 如果当前格子是陆地('1'),则进行深度优先搜索
if (grid[i][j] == '1'){
numberOfIslands++; // 发现一个新的岛屿
dfs(grid,i,j); // 进行深度优先搜索
}
}
}
return numberOfIslands;
}
// 深度优先搜索函数
private void dfs(char[][] grid, int row, int col){
int rows = grid.length;
int cols = grid[0].length;
// 如果当前位置超出了网格范围,或者当前位置是水('0'),则返回
if (row < 0 || row >=rows || col < 0 || col >= cols || grid[row][col] == '0'){
return;
}
//将当前位置标记为(水)
grid[row][col] = '0';
//对当前位置的上下左右四个方向进行深度优先搜索
dfs(grid, row - 1, col); // 上
dfs(grid, row + 1, col); // 下
dfs(grid, row, col - 1); // 左
dfs(grid, row, col + 1); // 右
}
// 打印二维数组的函数
private static void printGrid(char[][] grid) {
for (int i = 0; i < grid.length; i++) {
for (int j = 0; j < grid[0].length; j++) {
System.out.print(grid[i][j] + " ");
}
System.out.println(); // 换行
}
}
public static void main(String[] args) {
char[][] grid = {
{'1', '1', '0', '0', '0'},
{'1', '1', '0', '0', '0'},
{'0', '0', '1', '0', '0'},
{'0', '0', '0', '1', '1'}
};
System.out.println("Input grid:");
printGrid(grid); // 打印输入的 grid
NumberOfIslands numberOfIslands = new NumberOfIslands();
int count = numberOfIslands.numIslands(grid);
System.out.println("岛屿数量 : " + count);
}
}