设计思路
因为矩阵中的数是随机生成的,可能会有正有负,所以要首先判断二维数组中哪些位置上的数是正数,利用另一个二维数组记录正数的位置,然后判断哪些数是连通的,我的思路是先判断两个数的行数(列数)是否相同,如果相同,再判断列数(行数)是否相邻,如果相邻即证明两个数连通,计算每个连通块的数值的和,然后再连通不同的块,计算其和,最后比较其中的最大值,即为二维整数数组中最大联通子数组的和。
源程序代码
1 #include<iostream> 2 using namespace std; 3 int zuida(int n,int a[],int *sm,int *mm); 4 5 void main() 6 { 7 int m,n,i,j,sm,mm,t2; 8 int sum,max; 9 int up[100],down[100],t[100]; 10 int a[100][100],b[100]; 11 cout<<"输入二维数组的行"<<endl; 12 cin>>m; 13 cout<<"输入二维数组的列"<<endl; 14 cin>>n; 15 for(i=0;i<m;i++) 16 { 17 for(j=0;j<n;j++) 18 { 19 cin>>a[i][j]; 20 } 21 } 22 23 for(i=0;i<m;i++) 24 { 25 for(j=0;j<n;j++) 26 { 27 b[j]=a[i][j]; 28 } 29 sum=zuida(n,b,&sm,&mm); 30 up[i]=sm; 31 down[i]=mm; 32 t[i]=sum; 33 34 } 35 t2=t[0]; 36 for(i=0;i+1<m;i++) 37 { 38 if(up[i]<=down[i+1] && down[i]>=up[i+1]) 39 { 40 t2+=t[i+1]; 41 } 42 for(j=up[i];j<up[i+1];j++) 43 { 44 if(a[i+1][j]>0) t2+=a[i+1][j]; //判别独立正数 45 } 46 47 } 48 cout<<t2<<endl; 49 50 } 51 52 53 int zuida(int n,int a[],int *sm,int *mm) 54 { 55 int b[100]={0}; 56 int i,sum1=0,max1=0; 57 for(i=0;i<n;i++) 58 { 59 if(sum1<0) 60 { 61 sum1=a[i]; 62 } 63 else 64 { 65 sum1=sum1+a[i]; 66 } 67 b[i]=sum1; 68 } 69 max1=b[0]; 70 for(i=0;i<n;i++) 71 { 72 if (max1<b[i]) 73 { 74 max1= b[i]; 75 *mm = i; 76 } 77 } 78 for (i = *mm;i >= 0;i--) 79 { 80 if (b[i] == a[i]) 81 { 82 *sm= i; 83 break; 84 } 85 } 86 return max1; 87 }
运行结果截图
编程总结
这道题目比较难,需要仔细思考问题的解决方法。