您的位置:首页 > 其它

返回一个二维整数数组中最大子数组的和5

2015-06-08 22:29 393 查看
一、题目及要求:

题目:返回一个整数数组中最大子数组的和

要求(新加):①输入一个二维整形数组,数组里有正数也有负数;②二维数组首尾相接,像一条首尾相接的带子一样。

结对人员:孔维春 崔鹏勃

二、设计思路:

这个题目其实就是二维数组和环型数组的结合,要解决这个问题,将之前的两个问题融合一下即可。

首先解决求出二维数组中最大子数组的问题,然后沿用一维数组的方法,将第一列放到最后一列,在求出新的二维数组的最大子数组,依次求出各个二维数组的最大子数组。

三、部分源代码:

#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;

}


四、心得体会:

刚开始做的时候我感觉非常难,不知道怎么做。但是,经过和队友的努力终于做出了。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: