zoukankan      html  css  js  c++  java
  • 求二维矩阵和最大的子矩阵

     一、题目

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

     二、设计思路

          将二维数组转化为一维数组,在运用一维数组求最大子数组方法求出。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 }

    四、截图

     

        

     五、实验总结

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

      六、我们的合照

     

  • 相关阅读:
    ENVI【遥感图像预处理之图像的几何校正】
    ENVI数据显示操作【Tools菜单操作1】
    ENVI软件操作【数据显示操作——Overlay菜单操作】
    ENVI软件操作之【数据的显示操作】
    ADO.NET操作数据库(一)
    ASP.Net之数据绑定
    动态网页的建立
    VS2010安装异常中断后无法安装的解决方法(安装时发生严重错误)
    linux vi 删除多行的方法
    简单实现异步编程promise模式
  • 原文地址:https://www.cnblogs.com/wang321/p/4357243.html
Copyright © 2011-2022 走看看