结队小组成员:信1201-1班 燕亚峰
信1201-1班 王童博
一、题目与要求
求二维矩阵中和最大的子矩阵。
二、设计思路
将二维数组转化为一维数组,在运用一维数组求最大子数组方法求出。c[0][]=a[0][];c[1][]=a[0][]+a[1][];依次往下。然后将二维数组存到txt文件中。
三、源代码
#include<iostream.h> #include<fstream.h> void writeFile(int a[][20],int length,int row)//文件写入 { ofstream outFile; outFile.open("test.txt",ios::app); for(int i=0;i<row;i++) { for(int j=0;j<length;j++) { outFile<<a[i][j]<<" "; } outFile<<endl; } outFile.close(); } int max1(int a[],int N); int column(int a[][20],int length,int num1) //求最大和 { int y=0; int d[20]; int e[100]; int c[100][20]; c[0][0]=0; int p=0; int b[100]={0}; for(int j=0;j<num1;j++) { for(int t=j;t<num1;t++) { for(int i=0;i<length;i++) { b[i]=b[i]+a[t][i]; c[p][i]=b[i]; } p=p+1; } for(int o=0;o<100;o++) { b[o]=0; } } for(int l=0;l<p;l++) { for(int u=0;u<length;u++) { d[u]=c[l][u]; //cout<<d[u]<<" "; } e[y++]=max1(d,length); //cout<<e[y-1]<<" "; } int Max=e[0]; for(int i=0;i<y;i++) { if(e[i]>=Max) { Max=e[i]; } } return Max; } int max1(int a[],int N) //球一维最大和 { int b[20]; //正负交替数组 int c[20]; //最终比较数组 int i; int M; //存放数组b的长度 int j=0; int max; //存放最大值 int p=0; int sum; //相邻正数和 int sum1; //相邻负数和 sum=0; sum1=0; int u=0; //判断数组是否全负 for(i=0;i<N;i++) { if(a[i]>=0) { u=1; } } if(u==1) { //求出相邻正数或相邻负数的和,形成正负交替数组 for(i=0;i<N;i++) { if(a[i]>=0) { if(i<N-1) { if(a[i+1]>=0) { sum=sum+a[i]; } else { b[j++]=sum+a[i]; sum=0; } } else { if(a[i-1]>=0) { b[j++]=sum+a[N-1]; } else { b[j++]=a[N-1]; } } } else if(a[i]<0) { if(i<N-1) { if(a[i+1]<0) { sum1=sum1+a[i]; } else { b[j++]=sum1+a[i]; sum1=0; } } else { if(a[i-1]<0) { b[j++]=sum1+a[N-1]; } else { b[j++]=a[N-1]; } } } } M=j; if(b[0]<0) { j=1; } else { j=0; } //对数组B进行操作,将利用算法求的机最大值存入数组c中 for(int y=j;y<M;y=y+2) { if(y+2<M) { if(b[y]+b[y+1]>=0) { c[p++]=b[y]; b[y+2]=b[y+2]+b[y+1]+b[y]; if((y+2==M-1)||(y+2==M-2)) { c[p++]=b[y+2]; break; } } else { c[p++]=b[y]; } } else { c[p++]=b[y]; } } //对数组c求最大值 max=c[0]; for(i=0;i<p;i++) { if(c[i]>=max) { max=c[i]; } } return max; } else { max=a[0]; for(i=0;i<N;i++) { if(a[i]>=max) { max=a[i]; } } return max; } } int main() { ofstream outFile; outFile.open("test.txt",ios::app); int a[20][20]; int length,index; cout<<"输入行数列数:"; cin>>index>>length; outFile<<"行数:"<<index<<endl; outFile<<"列数:"<<length<<endl; outFile.close(); int y=0; for(int i=0;i<index;i++) { for(int j=0;j<length;j++) { cin>>a[i][j]; } } writeFile(a,length,index); int s=column(a,length,index); cout<<"最大和为:"<<s<<endl; return 0; }
四、截图
五、实验总结
一开始的时候我们两个想得不一样,我们分别讲了自己的思路,通过我们充分沟通,分配好了各自的任务。这次实验在文件的时候,我们找了很多资料,通过查阅资料解决了问题。我们想象不到二维数组怎么使用,我提出我们把所有的都列举出来,就想到了想到一维数组。一个人的思维总是有局限性的,只有通过沟通,思想才会更加完美。
六、合照