天天看点

返回一个二维整数数组中最大联通子数组的和

设计思路

因为矩阵中的数是随机生成的,可能会有正有负,所以要首先判断二维数组中哪些位置上的数是正数,利用另一个二维数组记录正数的位置,然后判断哪些数是连通的,我的思路是先判断两个数的行数(列数)是否相同,如果相同,再判断列数(行数)是否相邻,如果相邻即证明两个数连通,计算每个连通块的数值的和,然后再连通不同的块,计算其和,最后比较其中的最大值,即为二维整数数组中最大联通子数组的和。

源程序代码

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 }      

运行结果截图

返回一个二维整数数组中最大联通子数组的和

编程总结

这道题目比较难,需要仔细思考问题的解决方法。