这是一张及其偶然的结果,因为我没有实现如果不连通的情况下选择最小a[i][j]使其联通
所以这样,觉得万全之策应该是
//二维数组 寻求最大联通子数组
/*
初步规划:
1.寻求所有正数
2.判断是否联通 否继续
3.寻找子联通中最大和的作为基础
4.在以下操作中有两次循环,基础图中的各个最外面的元素与各个不是子联通图的最大权值,比较最大,判断是否为非负数,继而是否加入基础图
每一个不是基础的子联通正数元素(假设只有一个元素) 和基础最外面求最大权值,并比较各个外面的元素对应该子联通的最大,
若最最大权值>0,若是则选则该路径和该子联通,否则舍弃,进行下一个子联通的而判断
*/
利用数据结构寻找最大联通的方法
下面的代码为已=以上图示有误
package test4; import java.util.Random; //二维数组 寻求最大联通子数组 /* 初步规划: 1.寻求所有正数 2.判断是否联通 否继续 3.寻找子联通中最大和的作为基础 4.在以下操作中有两次循环,基础图中的各个最外面的元素与各个不是子联通图的最大权值,比较最大,判断是否为非负数,继而是否加入基础图 每一个不是基础的子联通正数元素(假设只有一个元素) 和基础最外面求最大权值,并比较各个外面的元素对应该子联通的最大, 若最最大权值>0,若是则选则该路径和该子联通,否则舍弃,进行下一个子联通的而判断 */ public class Ew { public static void main(String[] args){ int X=4,Y=5; int a[][]=new int[4][5]; int b[][]=new int[4][5]; Random r=new Random(); for(int i=0;i<X;i++){ for(int j=0;j<Y;j++){ a[i][j]=r.nextInt(20) - 10;//有正有负 } } for(int i=0;i<X;i++){ for(int j=0;j<Y;j++){ System.out.print(a[i][j]+" "); } System.out.println(" "); } System.out.println(" "); for(int i=0;i<X;i++){ for(int j=0;j<Y;j++){ if(a[i][j]>=0){ b[i][j]=1;//选中 } else{ b[i][j]=0; } } } for(int i=0;i<X-2;i++){ for(int j=0;j<Y-1;j++){//下右 if(b[i][j]!=1){ if((a[i][j]+a[i+1][j]>0)&& ((a[i][j]+a[i+1][j]+a[i+2][j]>0)||((a[i][j]+a[i+1][j]+a[i+1][j+1]>0)))){ b[i][j]=1; } } } } //下 左 for(int i=0;i<X-2;i++){ for(int j=Y-1;j>1;j--){ if(b[i][j]!=0){ if((a[i][j]+a[i+1][j]>0)&& (a[i][j])+a[i+1][j]+a[i+1][j-1]>0){ b[i][j]=1; } } } } //右下 for(int j=0;j<Y-2;j++){ for(int i=0;i<X-1;i++){ if(b[i][j]!=1){ if((a[i][j]+a[i][j+1]>0)&& ((a[i][j]+a[i][j+1]+a[i][j+2]>0)||((a[i][j]+a[i][j+1]+a[i+1][j+1]>0)))){ b[i][j]=1; } } } } //右上 for(int j=0;j<Y-2;j++){ for(int i=X-1;i>1;i--){ if(b[i][j]!=1){ if((a[i][j]+a[i][j+1]>0)&& ((a[i][j]+a[i][j+1]+a[i][j+2]>0)||((a[i][j]+a[i][j+1]+a[i-1][j+1]>0)))){ b[i][j]=1; } } } } for(int j=Y-1;j>1;j--){ for(int i=X-1;i>0;i--){//左下 if(b[i][j]!=1){ if((a[i][j]+a[i][j-1]>0)&& ((a[i][j]+a[i][j-1]+a[i][j-2]>0)||((a[i][j]+a[i][j-1]+a[i-1][j-1]>0)))){ b[i][j]=1; } } } } for(int j=Y-1;j>1;j--){ for(int i=0;i<X-1;i++){//左上 if(b[i][j]!=1){ if((a[i][j]+a[i][j-1]>0)&& ((a[i][j]+a[i][j-1]+a[i][j-2]>0)||((a[i][j]+a[i][j-1]+a[i+1][j-1]>0)))){ b[i][j]=1; } } } } for(int i=X-1;i>1;i--){ for(int j=Y-1;j>0;j--){//上左 if(b[i][j]!=1){ if((a[i][j]+a[i-1][j]>0)&& ((a[i][j]+a[i-1][j]+a[i-2][j]>0)||((a[i][j]+a[i-1][j]+a[i-1][j-1]>0)))){ b[i][j]=1; } } } } for(int i=X-1;i>1;i--){ for(int j=0;j<Y-2;j++){//上右 if(b[i][j]!=1){ if((a[i][j]+a[i-1][j]>0)&&(a[i][j]+a[i-1][j]+a[i-1][j+1]>0)) b[i][j]=1; } } } int sum=0; for(int i=0;i<X;i++){ for(int j=0;j<Y;j++){ if(b[i][j]==1){ System.out.print(a[i][j]+" "); sum+=a[i][j]; } else System.out.print("*"+" "); } System.out.println(" "); } } }