求二维矩阵和最大的子矩阵

 一、题目

      求二维矩阵中和最大的子矩阵。

 二、设计思路

      将二维数组转化为一维数组,在运用一维数组求最大子数组方法求出。c[0][]=a[0][];c[1][]=a[0][]+a[1][];依次往下。

      将二维数组存到txt文件中。

三、源代码

  1 #include<iostream.h>
  2 #include<fstream.h>
  3 void writeFile(int a[][20],int length,int row)//文件写入
  4 {
  5     ofstream outFile;
  6     outFile.open("test.txt",ios::app);
  7     for(int i=0;i<row;i++)
  8     {
  9         for(int j=0;j<length;j++)
 10         {
 11             outFile<<a[i][j]<<"  ";
 12         }
 13         outFile<<endl;
 14     }
 15     outFile.close();
 16 }
 17 int max1(int a[],int N);
 18 int column(int a[][20],int length,int num1) //求最大和
 19 {
 20     int y=0;
 21     int d[20];
 22     int e[100];
 23     int c[100][20];
 24     c[0][0]=0;
 25     int p=0;
 26     int b[100]={0};
 27     for(int j=0;j<num1;j++)
 28     {
 29         for(int t=j;t<num1;t++)
 30         {
 31             for(int i=0;i<length;i++)
 32             {
 33                 b[i]=b[i]+a[t][i];
 34                 c[p][i]=b[i];
 35             }
 36             p=p+1;
 37         }
 38         for(int o=0;o<100;o++)
 39         {
 40             b[o]=0;
 41         }
 42     }
 43     for(int l=0;l<p;l++)
 44     {
 45 
 46         for(int u=0;u<length;u++)
 47         {
 48             d[u]=c[l][u];
 49             //cout<<d[u]<<"  ";
 50         }
 51         e[y++]=max1(d,length);
 52         //cout<<e[y-1]<<"  ";
 53     }
 54     int Max=e[0];
 55     for(int i=0;i<y;i++)
 56     {
 57         if(e[i]>=Max)
 58         {
 59             Max=e[i];
 60         }
 61     }
 62     return Max;
 63 }
 64 int max1(int a[],int N)    //球一维最大和
 65 {
 66 
 67     int b[20];    //正负交替数组
 68     int c[20];    //最终比较数组
 69     int i;
 70     int M;        //存放数组b的长度
 71     int j=0;
 72     int max;      //存放最大值
 73     int p=0;
 74     int sum;      //相邻正数和
 75     int sum1;     //相邻负数和
 76     sum=0;
 77     sum1=0;
 78     int u=0;
 79     //判断数组是否全负
 80     for(i=0;i<N;i++)
 81     {
 82         if(a[i]>=0)
 83         {
 84             u=1;
 85         }
 86     }
 87     if(u==1)
 88     {
 89         //求出相邻正数或相邻负数的和,形成正负交替数组
 90         for(i=0;i<N;i++)
 91         {
 92             if(a[i]>=0)
 93             {
 94                 if(i<N-1)
 95                 {
 96                     if(a[i+1]>=0)
 97                     {
 98                         sum=sum+a[i];
 99                     }
100                     else
101                     {
102                         b[j++]=sum+a[i];
103                         sum=0;
104                     }
105                 }
106                 else
107                 {
108                     if(a[i-1]>=0)
109                     {
110                          b[j++]=sum+a[N-1];
111                     }
112                     else
113                     {
114                          b[j++]=a[N-1];
115                     }
116                 }
117 
118             }
119             else if(a[i]<0)
120             {
121                 if(i<N-1)
122                 {
123                     if(a[i+1]<0)
124                     {
125                         sum1=sum1+a[i];
126                     }
127                     else
128                     {
129                         b[j++]=sum1+a[i];
130                         sum1=0;
131                     }
132                 }
133                 else
134                 {
135                     if(a[i-1]<0)
136                     {
137                         b[j++]=sum1+a[N-1];
138                     }
139                     else
140                     {
141                         b[j++]=a[N-1];
142                     }
143                 }
144             }
145         }
146         M=j;
147         if(b[0]<0)
148         {
149             j=1;
150         }
151         else
152         {
153             j=0;
154         }
155         //对数组B进行操作,将利用算法求的机最大值存入数组c中
156         for(int y=j;y<M;y=y+2)
157         {
158             if(y+2<M)
159             {
160                 if(b[y]+b[y+1]>=0)
161                 {
162                     c[p++]=b[y];
163                     b[y+2]=b[y+2]+b[y+1]+b[y];
164                     if((y+2==M-1)||(y+2==M-2))
165                     {
166                         c[p++]=b[y+2];
167                         break;
168                     }
169                 }
170                 else
171                 {
172                     c[p++]=b[y];
173                 }
174             }
175             else
176             {
177                 c[p++]=b[y];
178             }
179 
180         }
181         //对数组c求最大值
182         max=c[0];
183         for(i=0;i<p;i++)
184         {
185             if(c[i]>=max)
186             {
187                 max=c[i];
188             }
189         }
190         return max;
191     }
192     else
193     {
194         max=a[0];
195         for(i=0;i<N;i++)
196         {
197             if(a[i]>=max)
198             {
199                 max=a[i];
200             }
201         }
202         return max;
203     }
204 }
205 int main()
206 {
207     ofstream outFile;
208     outFile.open("test.txt",ios::app);
209     int a[20][20];
210     int length,index;
211 
212     cout<<"输入行数列数:";
213     cin>>index>>length;
214     outFile<<"行数:"<<index<<endl;
215     outFile<<"列数:"<<length<<endl;
216     outFile.close();
217     int y=0;
218     for(int i=0;i<index;i++)
219     {
220         for(int j=0;j<length;j++)
221         {
222             cin>>a[i][j];
223         }
224     }
225     writeFile(a,length,index);
226 
227     int s=column(a,length,index);
228     cout<<"最大和为:"<<s<<endl;
229     return 0;
230 }

四、截图

 

    

 五、实验总结

 本次实验在文件写入方面,我与他找了些许资料。最终解决了。在思路方面,我们想延用以为数组的方法,但是对于我想象不到如何二维数组怎么使用,但是他提出我们把所有的都列举出来吧。顿时想到转化为一维数组的方法,运用到了程序里。一个人的思维总是有限的,只有思想的碰撞,往往才有更多的激发。

  六、我们的合照

 

原文地址:https://www.cnblogs.com/wang321/p/4357243.html