zoukankan      html  css  js  c++  java
  • 二维数组求最大联通子数组的和

    题目:返回一个二维整数数组中最大联通子数组的和。

    要求: 输入一个二维整形数组,数组里有正数也有负数。 求所有子数组的和的最大值。

    程序要使用的数组放在一个叫 input.txt 的文件中, 文件格式是: 数组的行数, 数组的列数, 每一行的元素, (用逗号分开) 每一个数字都是有符号32位整数,当然,行数和列数都是正整数。

    源程序

    /*
     设计思路:
    1、首先从文件读入一个二维整型数组(有正有负);
    2、从数组中选出最小的一个数,如果为负数则除去,检验联通性;
    3、联通,接下来找剩余中最小的数,如果为负数则除去,检验联通性;如果为正数,则可得最大的和。
    4、如果在检验联通性时不成立,则保存最近的联通数组的和。
    5、循环执行第3步,直到保存了所有可能的联通数组的和,找出最大值。
    */
    
    package zishuzu1;
    
    import java.io.*;
    
    public class zishuzu1 {
        static int b=52345;
        static int[][] p= new int[100][100];  
        public static void main(String[] args) throws IOException {
              
            File f = new File("input.txt");  
            BufferedReader buf = new BufferedReader(new FileReader(f));  
            int temp=0,line = 0;  
            String str;
            System.out.println("数组:");
            int m=Integer.parseInt(buf.readLine());//
            int n=Integer.parseInt(buf.readLine());//
            while ((str=buf.readLine()) != null) 
            {   
                String[] data = str.split(","); 
                for (int i = 0; i < data.length; i++) 
                {  
                     p[line][i] = Integer.parseInt(data[i]);  
                     if(temp!=line)
                     {
                         temp=line;
                         System.out.println();
                     }
                     System.out.print(p[line][i]+"  "); 
                }
                line++;  
            }
            System.out.println();
            
            int []a=new int [100];//保存和
            int []aa=new int [100];//保存去掉的使不连通的数
            int h=0,t=0,s=a[0],s1=0;
            for(int i=0;i<m;i++)
            {
                for(int j=0;j<n;j++)
                {
                    if(min(m,n)<0)
                    {
                        a[h]=sum(m,n);
                        aa[t]=qmin(m,n);
                        h++;
                        
                        if(liantong(m,n)==true)
                            continue;
                        else
                        {
                            t++;
                            continue;
                        }
                        
                    }
                    else
                    {
                        System.out.println("最大联通子数组的和:"+sum(m,n));
                        i=m;
                        break;
                    }
                    
                }
            }
            for(int d=0;d<h;d++)
            {
                if(a[d+1]>=a[d])
                    s=a[d+1];
            }
            for(int d=0;d<t-1;d++)
            {
                System.out.println(aa[d]);
                s1=s1+aa[d];
            }
            int result =s+s1;
            System.out.println("最大联通子数组的和:"+result);
    
        }
        public static boolean liantong(int m,int n)
        {
            int k=0; 
            for(int i=0;i<m;i++)
            {
                for(int j=0;j<n;j++)
                {
                    if(i==0&&j==0) 
                    {
                         if(p[i+1][j]==b&&p[i][j+1]==b)
                             k=-1;
                    }
                    else if(i==m-1&&j==n-1)
                    {
                         if(p[i-1][j]==b&&p[i][j-1]==b)
                             k=-1;
                    }
                    else if(i==0&&j==n-1)
                    {
                        if(p[i+1][j]==b&&p[i][j-1]==b)
                             k=-1;
                    }
                    else if(i==m-1&&j==0)
                    {
                        if(p[i-1][j]==b&&p[i][j+1]==b)
                             k=-1;
                    }
                    else if(i==0&&j!=0)
                    {
                         if(p[i+1][j]==b&&p[i][j+1]==b&&p[i][j-1]==b)
                             k=-1;
                    }
                    else if(i!=0&&j==0)
                    {
                         if(p[i+1][j]==b&&p[i-1][j]==b&&p[i][j+1]==b)
                             k=-1;
                    }
                    else if(i!=0&&i!=m-1&&j!=0&&j!=n-1)
                    {
                         if(p[i+1][j]==b&&p[i-1][j]==b&&p[i][j+1]==b&&p[i][j-1]==b)
                             k=-1;
                    }
                }
            }
            if(k==-1) return false;
            else return true;
        }
        public static int min(int m,int n)
        {  
            int minz=p[0][0];
            for(int i=0;i<m;i++)
            {
                for(int j=0;j<n;j++)
                {
                    if(p[i][j]!=b&&p[i][j]<minz)
                    {
                        minz=p[i][j];
                    }
                }
            }
            return minz;
        }
        public static int sum(int m,int n)
        {
            int sumz=0; 
            for(int i=0;i<m;i++)
            {
                for(int j=0;j<n;j++)
                {
                    if(p[i][j]!=b)
                    {
                        sumz=sumz+p[i][j];
                    }
                }
            }
            return sumz;
        }
        public static int qmin(int m,int n)
        {  
            int w=0;
            for(int i=0;i<m;i++)
            {
                for(int j=0;j<n;j++)
                {
                    if(min(m,n)==p[i][j])
                    {
                        w=p[i][j];
                        p[i][j]=b;
                        i=m;
                        break;
                    }
                }
            }
            return w;
        }
        
    }

    结果截图

    然而此程序还有小bug有待改进,还未成功。

    结对成员(刘玉,陈孜洋)

    编程过程中遇见很多思路的问题,两人相互讨论,得出都认可的解决方法。效率也提高了。

  • 相关阅读:
    ProGuard代码混淆
    电影资源网站分享
    mvn高级构建
    BeanUtils对象属性copy的性能对比以及源码分析
    你可能用到的Spring工具类?
    搭建K8s集群
    IDEA部署Spring-boot到Docker容器
    搭建团队协作办公wiki (confluence)
    Linux中关闭SSH的DNS解析
    责任链异步处理设计模型
  • 原文地址:https://www.cnblogs.com/qkmn/p/6684228.html
Copyright © 2011-2022 走看看