zoukankan      html  css  js  c++  java
  • 结对编程实践扩展

    题目:
      返回一个整数矩阵中最大子矩阵的和。
    要求:
      两人结对完成编程任务。
      一人主要负责程序分析,代码编程。
      一人负责代码复审和代码测试计划。
      
    思想:
      上一次的题目是返回一个整数数组中最大子数组的和;由于矩阵各个元素并不是完全可以
    完全连续的,所以从二维下手没能打开思路想到更好的方法,不过,想到上次的一维求和方法
    我可以将二维数组转变为多个一维数组求和,然后将所有数组求得的最大值再进行比较,得到
    矩阵最大子矩阵的和,方法的好处是解决了各元素排列难以是矩阵的问题,同时又结合了之前
    的方法,无需再想复杂的算法了。(临时想到的直接从二维开始计算的方法,难以形成程序,
    并且验证很困难,选择暂时放弃)
    程序源代码:
     1 #include<iostream>
     2 #include<ctime>
     3 using namespace std;
     4 int demo(int a[],int n){  //求一维数组最大数组元素之和
     5     int result=a[0],sum=0,k=0;
     6     for ( int j=0; j<n; j++ ) {
     7         if ( sum>=0 ){ sum+=a[j]; }
     8         else { sum=a[j]; }
     9         if( result < sum ) {
    10             result=sum;    
    11         }
    12     }
    13     return result;    //返回最大值
    14 }
    15 int main()
    16 {  
    17     srand((unsigned)time(NULL)); 
    18     int m,n;        //矩阵行m与列n
    19     cout<<"求矩阵中子矩阵元素和最大的值!"<<endl;
    20     cout<<"请输入行数m:";
    21     cin>>m;
    22     cout<<"请输入列数n:";
    23     cin>>n;
    24     int * temp=new int[n];  //临时数组,最终求得结果作为元素暂存
    25     int * compare=new int[(1+m)*m/2];    //比较所有暂存元素的最大值
    26     int ** arr=new int*[n];        //矩阵,二维数组
    27     int g=0,randoms;  //g用于累加计数
    28     for ( int i=0; i<m; i++ ) {  //随机产生矩阵列表
    29         temp[i]=0;    
    30         arr[i]=new int[n];    
    31         for(int j=0; j<n; j++){
    32             randoms = ( -rand()%100 + ( rand()%100 ) );        
    33             arr[i][j] = randoms;
    34             cout<<arr[i][j]<<"   ";
    35         }
    36         cout<<endl;
    37     }
    38     for(int k=1;k<=m;k++){// 表示k行数组各列元素的和
    39         for(int s=0;s<m+1-k;s++){
    40             for(int t=0;t<n;t++){
    41                 for(int h=0;h<k;h++){
    42                     temp[t]+=arr[s+h][t];
    43                 }                            
    44             }
    45             compare[g]=demo(temp,n);  //调用demo
    46             g++;
    47             for(int l=0;l<n;l++){
    48                 temp[l]=0;
    49             }
    50         }
    51     }
    52     for(int d=0;d<((1+m)*m/2);d++)  //排序,求最大矩阵元素之和
    53     {
    54         int x;
    55 
    56         for(int f=0;f<((1+m)*m/2)-d;f++){
    57             if(compare[f]<=compare[f+1]){
    58                 x=compare[f];
    59                 compare[f]=compare[f+1];
    60                 compare[f+1]=x;
    61             }
    62         }
    63     }
    64     cout<<endl<<"子矩阵元素和最大的值="<<compare[0]<<endl;
    65     return 0;
    66 }

    程序截图:

    结对编程总结:

      我的想法就是上面形成的程序,搭档的想法是将所有的矩阵一一计数,然后进行总体的比较,

    关键是统计所有的矩阵方面,需要一定得次序,他的想法是:如选择a[3][2]这一点后,只从下标

    均大于等于a[1][2]下标开始选择另一点,可以选择a[3][2]而不能选择a[1][1];依次从最开始的

    地方计算,这样可以保证不会漏记不会多记,不过我认为工作量比较大,没有考虑实现,但是一

    种很好的计数方法,比较有用。这种方法就由他来实现吧。通过这次编程实践,我觉得交流可以

    扩充思路,互相指点,很有帮助。^_^

  • 相关阅读:
    真实的人类第三季/全集Humans迅雷下载
    明日传奇第三季/全集Legends of Tomorrow迅雷下载
    怪奇物语第二季/全集Stranger Things迅雷下载
    行尸走肉第八季/全集The Walking Dead迅雷下载
    暗影猎人第一二季/全集Shadowhunters迅雷下载
    史上十大很黄很暴力的美剧
    蓝精灵:寻找神秘村Smurfs: The Lost Village迅雷下载
    神奇女侠Wonder Woman迅雷下载
    冰川时代5:星际碰撞Ice Age: Collision Course迅雷下载
    mysql慢查询监控及sql优化
  • 原文地址:https://www.cnblogs.com/bill927/p/4354212.html
Copyright © 2011-2022 走看看