求二维整数数组中最大子数组的和(结对作业)

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

  • 要求:(1)输入一个二维整形数组,数组里有正数也有负数。 

                     (2)二维数组中连续的一个子矩阵组成一个子数组,每个子数组都有一个和。

                     (3)求所有子数组的和最大值。

  • 结对编程要求:(1)两人结对完成编程任务。 

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

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

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

组员:20163946-谭松(分析)、20163976-韩文亮(编程)

程序分析:(1)先输入一个二维整数数组。

     (2)定义一个一维数组用来存放子矩阵的和。

        (3)求各个子矩阵的和,从左上角开始,确定一个起始点,再确定一个终止点,由此确定一个矩阵,计算此矩阵的和。从左上角到右下角,确定起始点终止点可以找出所有子矩阵。

     (4)将所有矩阵的和依次输出,每十个换行。

        (5)从存放子矩阵和的一维数组中比较大小找出最大的和,再输出。

程序代码:

 1 #include<iostream>
 2 #include <stdlib.h>
 3 using namespace std;
 4 #define N 100//定义数组最大范围
 5 int main()
 6 {
 7     int n,m,a,b,c,d,i,j,k=0; //n是行,m是列,a,b,c,d,i,j都是循环变量,k是sum[]的参数
 8     cout<<"please input the row and column of the array:";//输入二维数组的行和列
 9     cin>>n>>m;
10     if(n>N||m>N)//判断行和列是否超出范围
11     {
12         cout<<"please input again:";
13         cin>>n>>m;
14     }
15     int **A=new int*[n];//定义二维数组指针
16     for(i=0;i<n;i++)
17     {
18         A[i]=new int[m];
19     }
20     cout<<"please input array:"<<endl;//输入数组
21     for(i=0;i<n;i++)            
22     {
23         for(j=0;j<m;j++)
24         {
25             cin>>A[i][j];
26         }
27     }
28     int sum[1000],max;//sum[1000]用来储存子数组的和,max为最大值
29     sum[0]=0;
30     max=A[0][0];
31     for(a=0;a<n;a++)
32     {
33         for(b=0;b<m;b++)
34         {   
35             for(c=a;c<n;c++)
36             {
37                 for(d=b;d<m;d++)
38                 {
39                     for(i=a;i<=c;i++)
40                     {
41                         for(j=b;j<=d;j++)
42                         {
43                             sum[k]=sum[k]+A[i][j];
44                         }
45                     }
46                     
47                     k++;
48                     sum[k]=0;
49                  }
50             }
51         }
52     }
53     cout<<"the sum of the submatrices:"<<endl;
54     for(i=0;i<k;i++)
55     {   
56         cout<<sum[i]<<" ";//输出各个子数组和
57         if((i+1)%10==0)//每十个换行
58         {
59             cout<<endl;
60         }
61         if(sum[i]>max)//求最大值
62         {
63             max=sum[i];
64         }
65     }
66     cout<<endl<<"the sum of the largest subarray of the array is"<<max<<endl;//输出最大值
67     return 0;
68 }

测试截图:

 

实验总结:两个人共同合作,一起解决遇到的问题,对于那个循环我们是共同经过实际验算,实际验证,用了两个多小时,编出循环体。难的部分也是循环体部分,预计五个小时,实际七个小时。

猜你喜欢

转载自www.cnblogs.com/try-my--best/p/9825054.html