码迷,mamicode.com
首页 > 编程语言 > 详细

二维循环数组

时间:2015-03-31 23:56:24      阅读:157      评论:0      收藏:0      [点我收藏+]

标签:

一、题目与要求

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

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

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

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

二、设计思路

  在上一次的以为循环数组的基础上,和二维数组求最大子数组相结合,将功能合并,完成题目要求。

  • 第一步、将每一行的数组作为循环数组求最大子数组
  • 第二步、通过枚举的方式,将每一种情况的和存入到新建二维数组中
  • 第三部、通过逐列计算最大子数组的方法求所有子矩阵的最大和

如:原二维数组

1 2
3 4

每行求和后、

1 1+2 2 2+1
3 3+4 4 4+3

逐列求和、

1 1+2 2 2+1
1+3 1+2+3+4 2+4 2+1+4+3
3 3+4 4 4+3

这样就求出了所有子矩阵的和,然后比较大小就可以了

三、源代码

  1 // ketang5.cpp : 定义控制台应用程序的入口点。
  2 //张世通 梁世豪
  3 
  4 #include "stdafx.h"
  5 #include "iostream"
  6 using namespace std;
  7 
  8 /*二维数组压缩函数*/
  9 void yasuo(int **Source,int **Destion,int row,int line)
 10 {//将每一行的数组元素都用枚举法求出子数组
 11     int i,j,add,count;
 12     for(i=0;i<row;i++)
 13     {
 14         count=0;
 15         for(j=0;j<line;j++)
 16         {
 17             add=0;
 18             for(int l=0;l<line;l++)                            //每一行按顺序进行枚举存入数组中
 19             {
 20                 add=add+Source[i][l+j];
 21                 Destion[i][count+l]=add;
 22             }
 23             count=count+line;
 24             Source[i][line+j]=Source[i][j];
 25         }
 26     }
 27 }
 28 
 29 /*求最大值函数*/
 30 int Max(int **Destion,int row,int line)
 31 {
 32     int i,j,add,max;
 33     max=Destion[0][0];                                                //将数组的第一个数赋值给max
 34     for(j=0;j<line;j++)
 35     {
 36         for(i=0;i<row;i++)
 37         {
 38             add=0;
 39             for(int r=0;r<row-i;r++)
 40             {
 41                 add=add+Destion[r+i][j];                            //逐列对数组进行枚举,求最大值
 42                 if(max<add)
 43                 {
 44                     max=add;
 45                 }
 46             }
 47         }
 48     }
 49     return max;
 50 }
 51 
 52 /*数组初始化*/
 53 void chushihua(int**Arr,int row,int line)
 54 {
 55     cout<<"请输入数组数据"<<endl;
 56     for(int i=0;i<row;i++)
 57     {
 58         for(int j=0;j<line;j++)
 59         {
 60             cin>>Arr[i][j];
 61         }
 62     }
 63 }
 64 
 65 int main()
 66 {
 67     char s;
 68     int row,col1,col2;                                //定义行数列数
 69     cout<<"请输入行数:";
 70     cin>>row;
 71     cout<<"请输入列数:";
 72     cin>>col1;    
 73     int **A;                                        //动态定义二维数组
 74     int **B;
 75     col2=col1*col1;
 76     A=new int*[row];
 77     for(int k=0;k<row;k++)
 78     {
 79         A[k]=new int[col1];
 80     }
 81     B=new int*[row];
 82     for(int l=0;l<row;l++)
 83     {
 84         B[l]=new int[col2];
 85     }
 86     chushihua(A,row,col1);
 87     yasuo(A,B,row,col1);
 88     int max=Max(B,row,col2);
 89     cout<<"最大子数组之和为:"<<max<<endl;
 90     cout<<endl;
 91     cout<<"是否继续(Y/N)";
 92     cin>>s;
 93     while(s!=Y&&s!=y&&s!=N&&s!=n)
 94     {
 95         cout<<"输入错误,请重新输入(Y/N)";
 96         cin>>s;
 97     }
 98     if(s==Y||s==y)
 99     {
100         main();
101     }
102     return 0;
103 }

四、结果截图
技术分享

技术分享

技术分享

五、结果分析

  这次是在上次的基础上改进的,因为上次二维数组的代码主要是我写的,所以这次主要还是由我来改,这次改写过程中,只是改动了很小的一部分,就是循环的那一部分,其他的地方基本没有动。能很快的改写代码,实现结果,主要和上次我们一起确定下来的用比较模块化的函数实现整个过程分不开。这下体现出来了结对开发的优越性,两个人能想到的事,能规范的事,就算当时没有出现明显的效果,以后也会出现相当不错的收获。

  结对开发,两个人总会有不同的收获,可以互相帮助,比如这次我这次改写代码,仅需要改一个模块就行了,不再需要去关心整个实现过程,这要是放到以前,那绝对是牵一发而动全身,所以,在这里,我很感谢梁世豪,能提出意见和建议,互相借鉴,吸取对方的优点和长处,补充自己。结对是两个人之间的合作,以后还要有组队开发的项目,那是多人之间的合作,如果,两个人能合作的好,那么也一定会在多人合作中找到自己的位置,发挥自己的长处,弥补自己的不足

六、工作照

 

二维循环数组

标签:

原文地址:http://www.cnblogs.com/zhshto/p/4382256.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!