设计思路
和一维循环数组思路相仿,循环N次,每次将第一列的数移到最后一列,新建一个相同规格的二维数组来存放新矩阵,将之前写的求二维数组最大子矩阵的和的算法稍作修改,添加一个循环即可满足要求。
源程序代码
#include<iostream>
#include <cstdlib>
#include <ctime>
using namespace std;
#define M 4
#define N 4
void main()
{
int a[M][N],aa[M][N],i,j,b,c,z;
cout<<"请输入数值范围:"<<endl;
cin>>b>>c;
cout<<"生成二维数组为:"<<endl;
srand(unsigned(time(0)));
for(i=0;i<M;i++)
{
for(j=0;j<N;j++)
{
a[i][j]=rand()%(c-b+1)+b;
cout<<a[i][j]<<" ";
}
cout<<endl;
}
int sum,s[100],k=0,o=-1000,p=-1000,q=-1000;
for(j=0;j<N;j++)
{
s[j]=0;
}
for (int lun=0;lun<N;lun++)
{
for (int lunm=0;lunm<M;lunm++)
{
for (int lunn=0;lunn<N;lunn++)
{
if (lunn+lun<N)
{
aa[lunm][lunn]=a[lunm][lunn+lun];
}
else
aa[lunm][lunn]=a[lunm][lunn+lun-N];
}
}
for(int ii=0;ii<M;ii++)
{
while(k+ii<M)
{
for(j=0;j<N;j++)
{
s[j]=s[j]+aa[k+ii][j];
}
for (i=0;i<N;i++)
{
for (j=i;j<N;j++)
{
sum=0;
for (z=i;z<=j;z++)
{
sum=sum+s[z];
}
if (sum>o) o=sum;
}
if (o>p)
{
p=o;
}
}
k++;
}
if (p>q)
{
q=p;
}
k=0;
for(j=0;j<N;j++)
{
s[j]=0;
}
}
}
cout<<"子矩阵最大值为:"<<q<<endl;
}
运行结果截图
编程总结
在原代码的基础上修改代码可以节省许多时间,所以要能够熟练的读懂代码、修改代码。