一、题目

1、返回一个二维数组中最大子数组的和。

2、要求:

输入一个整形数组,数组里有正数也有负数。

数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。

求所有子数组的和的最大值。要求时间复杂度为O(n)。

程序要使用的数组放在一个叫 input.txt 的文件中,  文件格式是:

数组的行数,数组的列数,每一行的元素,  (用逗号分开)每一个数字都是有符号32位整数, 当然, 行数和列数都是正整数

将上述题目的各个结果转换成图形界面显示。

3、结对开发要求: 

    两人结对完成编程任务。一人主要负责程序分析,代码编程。一人负责代码复审和代码测试计划。

   发表一篇博客文章讲述两人合作中的过程、体会以及如何解决冲突(附结对开发的工作照)。  

二、设计思路
起初我和小伙伴一看到题就想到了这个想法,先比较数组中单个元素的最大值,之后,再比较行相邻两个数相加的最大值,再比较列相邻两个数相加的最大值,即以第一行,第一列元素为中心,逐渐向整个矩阵扩展。我相信很多同学都会有和我们一样的想法。最后,比较各个情况最大值,得出最终结果。但是呢,后来老师又叫了两个同学为我们讲解,我们显然似懂非懂,没有理解透,所以还是坚持了我们最初的想法,虽然代码不够简洁,但是我们还是会改进的。

三、代码

#include<iostream.h>
int max[6]={0};//存储最大值
int b[6]={1,1,1,1,1,1};//存储最大值的行坐标
int c[6]={1,1,1,1,1,1};//存储最大值的列坐标
int a[10][10];//存储文件中的数据
int line;     
int row; 
int main()
{
    int i,j;
    int line=2;
    int row=3;
    void biggest();
    cout<<"请输入数组元素:(两行三列)"<<endl;
    for(i=0;i<line;i++)
    {
        for(j=0;j<row;j++)
        {
            cin>>a[i][j];
        }
    }
    cout<<"数组元素为:"<<endl;
    for(i=0;i<line;i++)
    {
        for(j=0;j<row;j++)
        {
            cout<<a[i][j]<<"\t";
        }
        cout<<endl;
    }
    biggest();
    return 0;
}     
void biggest()//算出最大值
{
    int i,j;
    int k=0;
    int Max;
    max[0]=a[0][0];
    for(i=1;i<line;i++)
    {
        for(j=0;j<row;j++)
        {
            if(max[0]<a[i][j])
            {
                max[0]=a[i][j];
                b[0]=i+1;
                c[0]=j+1;
            }
        }
    }
    max[1]=a[0][0]+a[0][1];
    for(i=0;i<line;i++)
    {
        for(j=0;j+1<row;j++)
        {
            if(max[1]<(a[i][j]+a[i][j+1]))
            {
                max[1]=a[i][j]+a[i][j+1];
                b[1]=i+1;
                c[1]=j+1;
            }
        }
    }
    max[2]=a[0][0]+a[1][0];
    for(j=0;j<row;j++)
    {
        for(i=0;i+1<line;i++)
        {
            if(max[2]<(a[i][j]+a[i+1][j]))
            {
                max[2]=a[i][j]+a[i+1][j];
                b[2]=i+1;
                c[2]=j+1;
            }
        }
    }
    max[3]=a[0][0]+a[0][1]+a[0][2];
    for(i=0;i<line;i++)
    {
        for(j=0;j+2<row;j++)
        {
            if(max[3]<(a[i][j]+a[i][j+1]+a[i][j+2]))
            {
                max[3]=a[i][j]+a[i][j+1]+a[i][j+2];
                b[3]=i+1;
                c[3]=j+1;
            }
        }
    }
    max[4]=a[0][0]+a[0][1]+a[1][0]+a[1][1];
    for(i=0;i+1<line;i++)
    {
        for(j=0;j+1<row;j++)
        {
            if(max[4]<(a[i][j]+a[i][j+1]+a[i+1][j]+a[i+1][j+1]))
            {
                max[4]=a[i][j]+a[i][j+1]+a[i+1][j]+a[i+1][j+1];
                b[4]=i+1;
                c[4]=i+1;
            }
        }
    }
    max[5]=a[0][0]+a[0][1]+a[0][2]+a[1][0]+a[1][1]+a[1][2];
    b[5]=1;
    c[5]=1;
    Max=max[0];
    for(i=0;i<6;i++)
    {
        if(Max<max[i])
        {
            Max=max[i];
            k=i;
        }
    }
    cout<<"最大值为"<<Max<<endl;
    
}

四、截图

 

五、心得体会

古人言,车到山前必有路啊,柳暗花明又一村啊,我觉得真的是对的,从前编程序不会编是因为从来没有仔细认真的思考然后动手去编。

现在不同了,每周都有了事情去干,感觉生活的很有价值,因为所有的努力都可以在程序上得到见证,不再像以前一样没事就看韩剧了。

结对开发呢,乍一听非常的高大上,但是实际上却很有人情味的一种开发方式,这是和小伙伴的第二次合作啦,过程呢,当然是两个人一起

同甘共苦啦,再没有人比小伙伴更能感同身受,这让我有一种路上有人相伴的感觉,让晦涩的编程之路不是那么的黑暗寂寞,就像一米阳光。

在本次开发中,代码部分是我敲的,最原始的思路是我俩一起很有默契的想得,中间的过程还是她想得比较周到,我只是有个大概的思路,平时我

会比较马虎,她就很严谨,这就像化学反应一样酸碱中和,变成有用的平和的水。

题目我俩都觉得比较难,但是经过几天的编与想,还是弄出结果来了,很开心,有图有真相。

 

posted on 2015-03-25 20:06  掬雪煮茶  阅读(249)  评论(1编辑  收藏  举报