二维数组

这是一张及其偶然的结果,因为我没有实现如果不连通的情况下选择最小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(" ");
        }
        
    }
}

 

posted @ 2017-04-07 19:14  陶雨洁  阅读(235)  评论(0编辑  收藏  举报