#include<iostream> using namespace std; #define N 4 void maxhe(int a[],int &s,int &jmin,int &jmax) { int sum=a[0],b=a[0],x=0,y=0; int j=1; while((j-x<N)&&x<N) { if(b>=0) { b=a[j%N]; if(j<N) x=j; else break; } else b+=a[j%N]; if(sum>=b) { sum=b;y=j;} j++; } sum=0; for(int i=y+1;i<x+N;i++) sum+=a[i%N]; s=sum;jmin=y+1;jmax=x+N-1; int z=y%N; if(x>=z) { j=1;sum=a[0];b=a[0];x=0;y=0; while(j<N) { if(b<0) { b=a[j%N];x=j;} else b+=a[j%N]; if(sum<=b) { sum=b;y=j;} j++; } s=sum;jmin=x;jmax=y; } else if((x==0)&&(y==(N-1))) { sum=a[0];b=a[0];x=0;y=0; for(int o=1;o<N;o++) { if(a[o]>sum) {sum=a[o];x=o;y=o;} } s=sum;jmin=x;jmax=y; } } int main() { int a[N][N]; for(int i=0;i<N;i++) { for(int j=0;j<N;j++) { a[i][j]=rand()%6; if(rand()%2==1) a[i][j]=a[i][j]*(-1); } } cout<<"随机生成的二维数组为:"<<endl<<endl; for(int i=0;i<N;i++) { for(int j=0;j<N;j++) { cout<<a[i][j]<<" "; } cout<<endl; }///二维数组生成 int max=a[0][0],c1=0,c2=0,l1=0,l2=0; for(int i=0;i<N;i++) { for(int j=i;j<N;j++) { int b[N]={0};////定义可以存放各行相加和的数组 for(int k=0;k<N;k++) { for(int l=i;l<=j;l++) { b[k]+=a[l][k]; } cout<<b[k]<<" "; int s=b[0],jmin=0,jmax=0; maxhe(b,s,jmin,jmax); if(s>=max) {max=s;c1=jmin;c2=jmax;l1=i;l2=j;} } cout<<endl; } } cout<<"二维数组最大和为:"<<max<<endl; for(int i=l1;i<=l2;i++) { for(int j=c1;j<=c2;j++) { cout<<a[i][j%N]<<" "; } cout<<endl; } }
成员:宋雨佳 周雪莹
思路:从第一行开始,加一行加两行,一直将所有的二维数组转换成几个一维数组,再将上次做的一维数组首尾相接最大字数组合做成函数调用。
后感:其实这几次的作业都是在先前的作业的基础上加上些条件,所以应该将实现程序各功能的部分单独出来形成函数,待以后用的到的时候就可以直接调用,这样既简单又清楚明了。虽然思路清楚但是算法过于复杂,见到简单算法继续完善!