小学生都能看懂的题解 | #岛屿数量#
岛屿数量
https://www.nowcoder.com/practice/0c9664d1554e466aa107d899418e814e
问题描述:
你有一张地图,上面有些地方是陆地(用1
表示),有些地方是海洋(用0
表示)。如果两个1
相邻(上下左右),它们就属于同一个岛屿。我们需要计算这张地图上有多少个岛屿。
解决方案:
- 遍历地图:我们需要查看地图上的每一个格子。
- 找到陆地:如果看到的是
1
(陆地),我们就标记它,并且检查它的上下左右是否有其他的1
,如果有,我们也标记它们。 - 计数:每当我们找到一个新的
1
并标记它时,我们就认为发现了一个新的岛屿,并增加岛屿的计数。
代码实现:
我们可以用一个简单的程序来实现这个过程:
public class IslandCounter { public int solve(char[][] grid) { if (grid == null || grid.length == 0 || grid[0].length == 0) { return 0; // 如果地图是空的,没有岛屿 } int rows = grid.length; // 地图的行数 int cols = grid[0].length; // 地图的列数 int islands = 0; // 记录岛屿的数量 // 遍历地图上的每一个格子 for (int row = 0; row < rows; row++) { for (int col = 0; col < cols; col++) { if (grid[row][col] == '1') { markIsland(grid, row, col); // 标记这个岛屿 islands++; // 发现了一个新的岛屿 } } } return islands; // 返回岛屿总数 } // 标记一个岛屿 private void markIsland(char[][] grid, int row, int col) { // 检查边界 if (row < 0 || col < 0 || row >= grid.length || col >= grid[0].length || grid[row][col] != '1') { return; // 如果超出边界或者不是陆地,就退出 } // 标记这个位置为已访问 grid[row][col] = 'V'; // 检查上下左右的位置 markIsland(grid, row + 1, col); // 向下 markIsland(grid, row - 1, col); // 向上 markIsland(grid, row, col + 1); // 向右 markIsland(grid, row, col - 1); // 向左 } }
解释:
- 遍历地图:我们通过两层循环来查看地图上的每一个格子。
- 标记岛屿:当我们看到一个
1
时,我们知道这是一个新的岛屿的开始,于是我们调用markIsland
函数来标记这个岛屿。 - 增加计数:每当我们标记完一个岛屿,我们就增加岛屿的计数。
- 递归标记:
markIsland
函数会递归地检查当前格子的上下左右位置,如果它们也是1
,就继续标记它们。
如果这篇文章对你有帮助,请点个免费的赞👍,让它能够帮助更多的人。
#题解#小学生都能看懂的算法 文章被收录于专栏
主要面向小白的算法文章。以小学生都能看懂为目标而编写,顺便巩固下自己。