赞
踩
描述
给一个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
java
package net.test.app.liko; import static org.apache.hadoop.yarn.webapp.hamlet.HamletSpec.Media.print; import static sun.misc.Version.print; /** * @author dpx * @date 2023/8/21 9:57 * @Version 1.0 */ public class SolutionDaoYu { public static void main(String[] args) { char[][] arr1 = {{'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'}}; char[][] arr = new char[5][5]; arr[0] = new char[]{'1', '1', '0', '0', '0'}; arr[1] = new char[]{'0', '1', '0', '1', '1'}; arr[2] = new char[]{'0', '0', '0', '1', '1'}; arr[3] = new char[]{'0', '0', '0', '0', '0'}; arr[4] = new char[]{'0', '0', '1', '1', '1'}; System.out.println(SolutionDaoYu.solve(arr)); } public static 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个位置都置为0, 连着的算一个岛屿 dfs(grid, i, j); } } } // 返回岛屿的数量 return count; } // 将矩阵中当前格子以及其它临近的为1的格子都会置为1 public static 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, 然后从他的上下左右四个方向继续遍历 grid[i][j] = '0'; dfs(grid, i - 1, j); // 上 dfs(grid, i + 1, j); // 下 dfs(grid, i, j - 1); // 左 dfs(grid, i, j + 1); // 右 } }
scala
package net.clickwifi.app.test.liKo /** * @author dpx * @date 2023/8/16 11:11 * @Version 1.0 * */ object SolutionDaoYu { /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * 判断岛屿数量 * * @param grid char字符型二维数组 * @return int整型 */ def main(args: Array[String]): Unit = { val grid: Array[Array[Char]] = Array( Array('1', '1', '0', '0', '0'), Array('0', '1', '0', '1', '1'), Array('0', '0', '0', '1', '1'), Array('0', '0', '0', '0', '0'), Array('0', '0', '1', '1', '1') ) println(solve(grid)) } def solve(grid: Array[Array[Char]]): Int = { val n = grid.length //空矩阵的情况 if (n == 0) return 0 val m = grid(0).length //记录岛屿数 var count = 0 //遍历矩阵 for (i <- 0 until n) { for (j <- 0 until m) { //遍历到1的情况 if (grid(i)(j) == '1') { //计数 count += 1 //将与这个1相邻的所有1置为0 dfs(grid, i, j) } } } return count } //深度 优先遍历与i,j相邻的所有1 def dfs(grid: Array[Array[Char]], i: Int, j: Int): Unit = { val n = grid.length val m = grid(0).length // 置为0 grid(i)(j) = '0' //后续四个方向遍历 if (i - 1 >= 0 && grid(i - 1)(j) == '1') dfs(grid, i - 1, j) if (i + 1 < n && grid(i + 1)(j) == '1') dfs(grid, i + 1, j) if (j - 1 >= 0 && grid(i)(j - 1) == '1') dfs(grid, i, j - 1) if (j + 1 < m && grid(i)(j + 1) == '1') dfs(grid, i, j + 1) } }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。