结对开发之首尾相连二维数组求最大子数组
一、设计思路
这次扩展是在原来基础上更进一步,结合了前两次的题目,我们主要是对前两次代码的归纳总结。利用一维数组中成环的思路,加上二维数组中求得最大子数组的思路,将二维数组同第一次的一维数组一样进行变换,再求得最大子数组,以此类推,得到变换后各个数组的最大子数组的和,最后再进行比较,求得最大值。
二、源代码
// erweishuzuqiuzuida.cpp : Defines the entry point for the console application. // #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; }
三、运行结果截图
四、心得体会
这次实验并没有花费很多时间,因为问题见过只是变换了形式,加深了难度,但无论是二维数组还是成环后求最大子数组的和都已经在前面得到了解决,所以,只是在原有代码的基础上增添了部分代码便求得了结果。由于上次二维数组问题的解决有局限性,此次对问题的解决也不是很完善,但基本上完成了题目的要求。
五、附图