设计思路
因为矩阵中的数是随机生成的,可能会有正有负,所以要首先判断二维数组中哪些位置上的数是正数,利用另一个二维数组记录正数的位置,然后判断哪些数是连通的,我的思路是先判断两个数的行数(列数)是否相同,如果相同,再判断列数(行数)是否相邻,如果相邻即证明两个数连通,计算每个连通块的数值的和,然后再连通不同的块,计算其和,最后比较其中的最大值,即为二维整数数组中最大联通子数组的和。
源程序代码
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 }
运行结果截图
编程总结
这道题目比较难,需要仔细思考问题的解决方法。