您的位置:首页 > 其它

求二维矩阵和最大的子矩阵

2015-03-22 13:52 393 查看
一、题目

求二维矩阵中和最大的子矩阵。

二、设计思路

将二维数组转化为一维数组,在运用一维数组求最大子数组方法求出。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;
}


四、截图









五、实验总结

本次实验在文件写入方面,我与他找了些许资料。最终解决了。在思路方面,我们想延用以为数组的方法,但是对于我想象不到如何二维数组怎么使用,但是他提出我们把所有的都列举出来吧。顿时想到转化为一维数组的方法,运用到了程序里。一个人的思维总是有限的,只有思想的碰撞,往往才有更多的激发。

六、我们的合照

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