package main.java.test; import java.util.Arrays; import java.util.Scanner; public class t5 { public static void main(String[] args) { //Scanner sc = new Scanner(System.in); //String s = sc.nextLine(); String s = "3 5"; String[] s1 = s.split(" "); System.out.println(s1); // 使用 Arrays.toString() 方法打印数组 System.out.println(Arrays.toString(s1)); int m = Integer.parseInt(s1[0]); int n = Integer.parseInt(s1[1]); //int[][] ints = new int[m][n]; int[][] ints = {{0,0,1,0,0}, {0,1,1,0,0}, {2,0,0,0,0},{2,0,1,2,3},{0,0,1,2,5}}; System.out.printf(String.valueOf(fun(ints)) ); } /* 0,0,1,0,0 0,1,1,0,0 2,0,0,0,0 2,0,1,2,3 0,0,1,2,5 安顺序 从第一列向下开始 第一个点 为2 没有出界 记下2 把2置为0 四周的点执行dfs 他的上左右都返回0 下返回2 把记录的2 加下面点执行dfs返回的2 返回给fun函数 此时 0,0,1,0,0 0,1,1,0,0 0,0,0,0,0 0,0,1,2,3 0,0,1,2,5 fun继续执行循环 执行到第二列第二个点 没有出界 查看值为1 记录并置为0 四周的点执行dfs 右侧点值为1 但是此点执行dfs返回的值为2 把记录的1 加右面点执行dfs返回的2 返回给fun函数 此时 0,0,0,0,0 0,0,0,0,0 0,0,0,0,0 0,0,1,2,3 0,0,1,2,5 */ // 计算二维数组中最大的连通区域的和 static int fun(int[][] ints){ int m = ints.length; int n = ints[0].length; int max = 0; // 记录最大和 for (int i = 0; i < m; i++) { for (int j = 0; j < n; j++) { if(ints[i][j]>0){ // 使用深度优先搜索计算当前位置的连通区域的和 int sum = dfs(ints,i,j); // 更新最大和 if (sum > max) max = sum; } } } return max; } // 使用深度优先搜索计算二维数组中某个位置的连通区域的和 static int dfs(int[][] ints,int i,int j){ int m = ints.length; int n = ints[0].length; // 如果越界或者值为 0,直接返回 0 if (i < 0 || i >= m || j < 0 || j >= n || ints[i][j] == 0) { return 0; } // 记录当前位置的值,并将其置为 0,避免重复计算 int value = ints[i][j]; ints[i][j] = 0; // 递归计算上下左右四个方向的连通区域的和,并加上当前位置的值 return value + dfs(ints,i+1,j) + dfs(ints,i-1,j) + dfs(ints,i,j+1) + dfs(ints,i,j-1); } }View Code
标签:连通,Components,int,s1,dfs,Connected,ints,fun,String From: https://www.cnblogs.com/q1231/p/17364023.html