返回一个二维整数数组中最大子数组的和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]<<"\t";
        }
        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("\n");
    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("\n");
    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("\n最大和%d\n",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("\n");
        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("\n");
        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("\n最大和%d\n",maxx);
    }

        return 0;

    
}

 

四、心得体会:

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

    

 

posted @ 2015-06-08 22:29  骑拉帝亚  阅读(180)  评论(0编辑  收藏  举报