二维数组最大子数组算法
小组成员: 贾川 李驭龙
算法思想:
先将这个二维数组的每一行每一列的最大子数组求出来存到一个一维数组内,
然后再循环求出每个矩形块元素之和再在依次存入到这个一维数组内。最后在这
个一位数组中找出最大子数组。
源程序代码如下:
#include "stdafx.h" #include "stdio.h" int m;//记录一位数组的个数 int max;//记录最大子数组和 void Max0(int a[][3])//此函数作用为把二维数组每个子数组块和找出来存入到一个一维数组里,再通过比较找到一个最大的值max { int i,j,k,m,sum,b[100]; m=0; for(i=0;i<3;i++) { for(j=0;j<2;j++) { sum=a[i][j]; for(k=j+1;k<3;k++) { sum=sum+a[i][k]; b[m++]=sum; } } } for(i=0;i<3;i++) { for(j=0;j<2;j++) { sum=a[j][i]; for(k=j+1;k<3;k++) { sum=sum+a[k][i]; b[m++]=sum; } } } for(i=0;i<2;i++) { for(j=0;j<2;j++) { sum=a[i][j]+a[i+1][j]; for(k=j+1;k<3;k++) { sum=sum+a[i][k]+a[i+1][k]; b[m++]=sum; } } } for(i=0;i<2;i++) { for(j=0;j<2;j++) { sum=a[j][i]+a[j][i+1]; for(k=j+1;k<3;k++) { sum=sum+a[k][i]+a[k][i+1]; b[m++]=sum; } } } for(i=0;i<1;i++) { for(j=0;j<2;j++) { sum=a[i][j]+a[i+1][j]+a[i+2][j]; for(k=j+1;k<3;k++) { sum=sum+a[i][k]+a[i+1][k]+a[i+2][k]; b[m++]=sum; } } } for(i=0;i<1;i++) { for(j=0;j<2;j++) { sum=a[j][i]+a[j][i+1]+a[j][i+2]; for(k=j+1;k<3;k++) { sum=sum+a[i][k]+a[k][i+1]+a[k][i+2]; b[m++]=sum; } } } for(i=0;i<3;i++) { for(j=0;j<3;j++) { b[m++]=a[i][j]; } } max=b[0]; for(i=0;i<m;i++) { if(max<=b[i]) { max=b[i]; } } printf("最大子数组和为:%d\n",max); } int main(int argc, char* argv[]) { int num[3][3]; int i,j; printf("请输入九个数:\n"); for(i=0;i<3;i++) { for(j=0;j<3;j++) { scanf("%d",&num[i][j]); } } printf("生成的数组矩阵为:\n"); for(i=0;i<3;i++) { for(j=0;j<3;j++) { printf("%d ",num[i][j]); if(j==2) { printf("\n\n"); } } } Max0(num); return 0; }
运行结果如下:
草稿设计图如下:(可能有点乱)
实验心得:
这次试验主要是根据上次的一维数组求最大子数组算法的改编,也是逐个寻找,
只是多了几个for循环内部矩阵的查找。缺点比较明显,占用资源量比较大。