您的位置:首页 > 其它

二维数组最大子数组的和首尾相连

2015-04-22 18:44 323 查看
#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

;

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
={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;

}

}

成员:宋雨佳 周雪莹

思路:从第一行开始,加一行加两行,一直将所有的二维数组转换成几个一维数组,再将上次做的一维数组首尾相接最大字数组合做成函数调用。

感受:每次都是她来编程,下次我一定自己编,不管能不能做出来吧,总得试试。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: