結對開發——最大聯通子數組的和

1、題目及要求html

題目:返回一個二維整數數組中最大聯通子數組的和。
要求:
輸入一個二維整形數組,數組裏有正數也有負數。
求全部子數組的和的最大值。要求時間複雜度爲O(n)。
程序要使用的數組放在一個叫 input.txt 的文件中, 文件格式是:
數組的行數,
數組的列數,
每一行的元素
每個數字都是有符號32位整數,固然,行數和列數都是正整數。
2、設計思想
由於每個數字都是有符號32位整數,因此選擇了long型。從文件中讀取,採用c++輸入輸出流。矩陣中的數是隨機生成的,可能會有正有負,因此要首先判斷二維數組中哪些位置上的數是正數,利用另外一個二維數組記錄正數的位置,而後判斷哪些數是連通的,個人思路是先判斷兩個數的行數(列數)是否相同,若是相同,再判斷列數(行數)是否相鄰,若是相鄰即證實兩個數連通,計算每一個連通塊的數值的和,而後再連通不一樣的塊,計算其和,最後比較其中的最大值,即爲二維整數數組中最大聯通子數組的和。
3、源代碼
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
#include<iostream>
#include<fstream>
using namespace std;
 
long Max( long n, long a[], long *smark, long *mmark)
{
     long b[100]={0};
     long sum1=0,max1=0,i;
     for (i=0;i<n;i++)
     {
         if (sum1<0)
         {
             sum1=a[i];
         }
         else
         {
             sum1=sum1+a[i];
         }
         b[i]=sum1;
     }
     max1=b[0];
     for (i=0;i<n;i++)
     {
         if (max1<b[i])
          {
              max1= b[i];
              *mmark = i;
          }
     }
      for (i = *mmark;i >= 0;i--)
     {
         if (b[i] == a[i])
         {
              *smark = i;
              break ;
         }
     }
      return max1;
}
 
int main()
{
     long m,n,i,j,t2,c[2];
     long sum,smark,mmark;
     long up[100],down[100],t[100];
     long a[100][100],b[100];
     ifstream infile;
     infile.open( "input.txt" , ios::in);
       if (infile.is_open() == false )
       {
          cerr << "open error!" << endl;
          exit (1);
       }
     
     cout<< "二維數組的行數和列數:" ;
      for (i=0;i<2;i++)
      {
      infile >> c[i];
      
      }          //在顯示器上順序顯示個數
      m=c[0];
      n=c[1];
      cout<<m<< " " <<n<<endl;
     cout<< "數組爲" <<endl;
     for (i=0;i<m;i++)
     {
         for (j=0;j<n;j++)
         {
             infile>>a[i][j];
             cout<<a[i][j]<< "   " ;
         }
         if (j%n==0)
         {
             cout<<endl;
         }
     }
     //把二維數組按行分解爲幾個一維數組
     for (i=0;i<m;i++)
     {
         for (j=0;j<n;j++)
         {
             b[j]=a[i][j];
         }
         sum=Max(n,b,&smark,&mmark);
         up[i]=smark;                                   
         down[i]=mmark;
         t[i]=sum;
 
     }
     t2=t[0];
     for (i=0;i+1<m;i++)
     {
         if (up[i]<=down[i+1] && down[i]>=up[i+1])
         {
             t2+=t[i+1];
         }
          for (j=up[i];j<up[i+1];j++)
         {
             if (a[i+1][j]>0) t2+=a[i+1][j];                   //判別獨立正數
         }
 
     }
      cout<< "最大聯通子數組和爲" ;
      cout<<t2<<endl;
      return 0;
 
}

4、結果截圖ios

 

5、項目計劃日誌c++

 

日期&&任務數組

聽課 編寫程序 閱讀相關書籍 網上查找資料   日總計
週一 100   30 30 160
週二   120 30 30 180
週三   30 30 10 70
週四 100 20  30   150
週五   120   30 30 180
週六   145 30 10 85
週日   200 30     
周總計 200 635 210 110

1155post

 

時間記錄日誌編碼

3/28spa

日期 開始時間 結束時間 中斷時間 淨時間 活動 備註
3/28 14:00 15:50 10 100 聽課 軟件工程上課
  21:04 21:  34 0 30 閱讀書籍 《構建之法》
  22:10 22: 40 30 網上查找資料  查閱安卓相關資料
 3/29  18:00  18:30  0  30  閱讀書籍 《構建之法》 
  19:00 21:30 20 120 編寫程序 結對開發- 安卓APP
  22:  15 22:  45 30 網上查找資料  查閱安卓相關資料
3/30 19:  25 20: 00 5 30 編寫程序 結對開發- 安卓APP
  22:00 22: 30 0 30 閱讀書籍 《構建之法》
  22:40 22: 50 0 10 查找資料  查閱安卓相關資料
3/31 14:00 15:  50 10 100 上課 軟件工程上課
  18:26 18: 50 20 編寫程序 結對開發- 聯通版
   22:00  22:30  0  30  閱讀書籍  《構建之法》
4/1 14:  00 16:  20 20 120  編寫程序 結對開發- 安卓APP
  11:23 12: 00 7 30 網上查找資料  查閱安卓相關資料
   21:00  21:30  0  30  閱讀書籍  《構建之法》
4/2 7: 00   7: 30 0 30 閱讀書籍 閱讀《構建之法》
  10: 00 13: 00 35 145 編寫程序 結對開發- 安卓APP
  9:   45   9: 55  0 10 網上查找資料  查閱安卓相關資料
4/3 8:20 12:  00 20 200 編寫程序 結對開發-聯通版
  15: 23 16: 00 7 30 閱讀書籍 閱讀《構建之法》

 

缺陷記錄日誌設計

 

日期 編號 類型 引入階段 排除階段 修復時間 備註
3/31 1 20 編碼 編譯 4 最開始沒有定義long型
3/31 2 20 編碼 編譯 1 文件打開有問題
4/1 20  編碼  編譯  7 當數組長度爲0時,沒法正常跳出

 

同組的小夥伴:http://www.cnblogs.com/a1397240667/p/5294473.html3d

相關文章
相關標籤/搜索