结对开发5

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

要求:

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

二维数组首尾相接,象个一条首尾相接带子一样。

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

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

结对编程要求:

两人结对完成编程任务。

一人主要负责程序分析,代码编程。

一人负责代码复审和代码测试计划。

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

一、设计思路

      这一次,因为诸多原因,我两互换了角色,由我负责程序分析,代码编程,由郭庆樑负责代码复审和代码测试计划。我们的思路是把原来的二维数组扩展,首尾拼接,假设原来二维数组的长度为宽和高分别为n和m,即扩展成为2n-1,2m-1,必须要添加限制条件,使其行和列数量相加不得超过原来的n和m。

二、源代码

#include<stdio.h>
int rect[55][55];//二维数组行和列最大为55
int w,l;         //w表示行,l表示列
int longest(int a[])
{
     int i,j,find=0,max;
   for(i=0;i<l;i++)
   {
      max=0;
      for(j=i;j<2*l-2&&(j-i)<l;j++)//将二维数组长度扩展为2n-2
      {
         max+=a[j%l];             //行列相加不超过原来的最大行列值
         if(max>find) 
          find=max;            //find取得最大值
      }
     }
     return find;
}
int Rect(int a[55][55]) 

     int i,j,k;
     int find=0;         //表示最终的最大值
     int b[55];
     int buf;
     for(i=0;i<w;i++) 
   {
          for(j=0;j<l;j++)
              b[j]=0;
          for(j=i;j<2*w-2&&(j-i)<w;j++)//将二维数组长度扩展为2n-2
      {
              for(k=0; k<l; k++)
        {
                  b[k]+=a[j%w][k];     //行列相加不超过原来的最大行列值
              }
              buf=longest(b);
        if(find<buf) 
          find=buf;
          }
     }
     return find;
}
int main()
{
     int i,j;
     int result;
   printf("请输入二维数组的行和列:\n");
     scanf("%d%d",&w,&l);
   printf("请输入二维数组:\n");
   for(j=0;j<w;j++)
     for(i=0;i<l;i++)
       scanf("%d",&rect[j][i]);
   result=Rect(rect);
   printf("最大子数组的和为:%d\n",result);
     return 0;
}

 三、截图

四、总结

这一次有我主要负责编写代码,期间我犯了不了不少原以为的低级错误,吸取了不少经验。这次角色互换是一个不错的体验。

五、工作照

 

posted @ 2015-04-07 22:18  一叶落秋  阅读(82)  评论(0编辑  收藏  举报