• 返回一个二维整数数组中最大子数组的和5


    一、题目及要求:

          题目:返回一个整数数组中最大子数组的和

          要求(新加):①输入一个二维整形数组,数组里有正数也有负数;②二维数组首尾相接,像一条首尾相接的带子一样。

          结对人员:孔维春 崔鹏勃

    二、设计思路:

          这个题目其实就是二维数组和环型数组的结合,要解决这个问题,将之前的两个问题融合一下即可。

          首先解决求出二维数组中最大子数组的问题,然后沿用一维数组的方法,将第一列放到最后一列,在求出新的二维数组的最大子数组,依次求出各个二维数组的最大子数组。

    三、部分源代码:

    #include "stdafx.h"
    #include "fstream.h"
    #include "iostream.h"
    #include "stdio.h"
    
    #define MAXSIZE 50
    
    
    void read(int array[][MAXSIZE],int &len1,int &len2)//读取文件信息,并写入数组
    {
        ifstream infile("array.txt");
        if(!infile)
            cout<<"读取失败!"<<endl;
        else
        {
            infile>>len1>>len2;
            for(int i=0;i<len1;i++)
            {
                for(int j=0;j<len2;j++)
                {
                    infile>>array[i][j];
                }
            }
        }
    }
    void display(int array[][MAXSIZE],int len1,int len2,int size1,int size2)//显示数组信息
    {
        for(int i=len1;i<=size1;i++)
        {
            for(int j=len2;j<=size2;j++)
            {
                cout<<array[i][j]<<"	";
            }
            cout<<endl;
        }
    }
    int * shuchu(int m[],int szcdx,int xhy)//m[]表示要测试的数组,szchx表示数组长度,xhy表示循环条件
    {
        int t,p;
        int max,sum;
        //缓存数组赋值
        int c[10000];
        int v[10000];
        int o=2*szcdx;
        int * temp= new int[o];
        
        for(t=szcdx-xhy-1;t<szcdx;t++)
        {
            c[t-szcdx+xhy+1]=m[t];
        }
        //循环
        for(t=xhy;t>=0;t--)
        {
            sum=0;
            for(p=0;p<=t;p++)
            {
                sum=sum+c[p];
            }
            v[t]=sum;
        }
        //循环输出最大值
        max=v[0];
        for(t=0;t<xhy+1;t++)
        {
            if(max<=v[t])
            {
                max=v[t];
            }
            //printf("%d  ",v[t]);
            temp[t]=v[t];
        }
        return temp;
    }
    int maxs(int s[],int length)//输出最大值
    {
        int d=s[0];
        for(int f=0;f<length;f++)
        {
            if(d<=s[f])
            {
                d=s[f];
            }
        }
        return d;    
    }
    int main(int argc, char* argv[])
    {
        int len1,len2;                       //len1是行数,len2是列数
        
        int x[3];
        int y[3];
        int *k;
        int *l;
        int array[MAXSIZE][MAXSIZE];
        read(array,len1,len2);
        cout<<"矩阵:"<<endl;
        display(array,0,0,len1-1,len2-1);
        
        
        
        for(int i=0;i<3;i++)
        {
            x[i]=array[0][i];
            
        }
        int e=3;
        int w[6];
        int u[6];
        int q=0;
        printf("数组第一行子数组的和:");
        for(i=2;i>=0;i--)
        {
            
            k=shuchu(x,3,i);
            for(int r=0;r<e;r++)
            {
                
                w[q]=k[r];
                printf("%d  ",w[q]);
                q++;
            }
            e--;    
        }
        for(int j=0;j<3;j++)
        {
            y[j]=array[1][j];
        }
        printf("
    ");
        e=3;
        q=0;
        printf("数组第二行子数组的和:");
        for(i=2;i>=0;i--)
        {
            
            l=shuchu(y,3,i);
            for(int r=0;r<e;r++)
            {
                
                u[q]=l[r];
                printf("%d  ",u[q]);
                q++;
            }
            e--;    
        }
        
        
        printf("
    ");
        int h[6];
        printf("数组包含两行的子数组的和:");
        for(int m=0;m<6;m++)
        {
            h[m]=w[m]+u[m];
            printf("%d  ",h[m]);
        }
        
        
        int k1=maxs(w,6);
        int k2=maxs(u,6);
        int k3=maxs(h,6);
        
        int maxx=k1;
        if(maxx<=k2)
        {
            maxx=k2;
        }
        if(maxx<=k3)
        {
            maxx=k3;
        }
        printf("
    最大和%d
    ",maxx);
        
        
        
        
        int r1;
        int p1;
        for(int t=0;t<2;t++)
        {
            p1=array[0][0];
            r1=array[1][0];
            for(q=0;q<2;q++)
            {
                
                array[0][q]=array[0][q+1];
                array[1][q]=array[1][q+1];
                
            }
            array[0][2]=p1;
            array[1][2]=r1;
            for(int i=0;i<3;i++)
            {
                x[i]=array[0][i];
                
            }
            int e=3;
            int w[6];
            int u[6];
            int q=0;
            printf("数组第一行子数组的和:");
            for(i=2;i>=0;i--)
            {
                
                k=shuchu(x,3,i);
                for(int r=0;r<e;r++)
                {
                    
                    w[q]=k[r];
                    printf("%d  ",w[q]);
                    q++;
                }
                e--;    
            }
            for(int j=0;j<3;j++)
            {
                y[j]=array[1][j];
            }
            printf("
    ");
            e=3;
            q=0;
            printf("数组第二行子数组的和:");
            for(i=2;i>=0;i--)
            {
                
                l=shuchu(y,3,i);
                for(int r=0;r<e;r++)
                {
                    
                    u[q]=l[r];
                    printf("%d  ",u[q]);
                    q++;
                }
                e--;    
            }
            
            
            printf("
    ");
            int h[6];
            printf("数组包含两行的子数组的和:");
            for(int m=0;m<6;m++)
            {
                h[m]=w[m]+u[m];
                printf("%d  ",h[m]);
            }
            
            
            int k1=maxs(w,6);
            int k2=maxs(u,6);
            int k3=maxs(h,6);
            
            int maxx=k1;
            if(maxx<=k2)
            {
                maxx=k2;
            }
            if(maxx<=k3)
            {
                maxx=k3;
            }
            printf("
    最大和%d
    ",maxx);
        }
    
            return 0;
    
        
    }

    四、心得体会:

          刚开始做的时候我感觉非常难,不知道怎么做。但是,经过和队友的努力终于做出了。

        

  • 相关阅读:
    ★漫画:优秀的程序员具备哪些属性?
    不评价别人的生活,是一个人最基本的修养
    不评价别人的生活,是一个人最基本的修养
    OSX 10.8+下开启Web共享的方法 /转
    OSX 10.8+下开启Web共享的方法 /转
    将客户端信息记录到服务器的简便方法
    将客户端信息记录到服务器的简便方法
    关于selenium IDE找不到元素bug
    关于selenium IDE找不到元素bug
    ★用辩证数学解答“缸中之脑”
  • 原文地址:https://www.cnblogs.com/littilsaber/p/4562144.html
Copyright © 2020-2023  润新知