天天看點

最大聯通子數組(結對開發)

題目:傳回一個二維整數數組中最大聯通子數組的和。

要求:

     檔案讀入數組。

結對開發的夥伴:

部落格名:Mr.缪

姓名:缪金敏

連結:http://www.cnblogs.com/miaojinmin799/

分析:把二維數組看成一個個節點,使用深度優先周遊,遞歸周遊所有節點,設一個變量每通路一節點加上它的值,這個值與最大值比較,記錄較大值,循環完後便是最大值。用檔案輸入流來讀檔案裡存好的行列和數組。

代碼: 

1 //最大子數組3   求一個二維數組的最大聯通子數組
  2 //王文奇 缪金敏2016/4/4
  3 #include<iostream>
  4 #include<fstream>
  5 using namespace std;
  6 #define MAX 10000
  7 
  8 int row;
  9 int col;
 10 int Graph[MAX][MAX];
 11 bool v[MAX][MAX];
 12 int MaxSum;
 13 void BFS(int r, int c, int num)
 14 {
 15     if (MaxSum < num)
 16     {
 17         MaxSum = num;
 18         //v[r][c] = true;
 19     }
 20     if (r != (row - 1))
 21     {
 22         if (v[r + 1][c] == false)
 23         {
 24             v[r + 1][c] = true;
 25             BFS(r + 1, c, Graph[r + 1][c] + num);
 26             //if (Graph1[r + 1][c] == true)
 27             v[r + 1][c] = false;
 28         }
 29     }
 30     if (r != 0)
 31     {
 32         if (v[r - 1][c] == false)
 33         {
 34             v[r - 1][c] = true;
 35             BFS(r - 1, c, Graph[r - 1][c] + num);
 36             //if (Graph1[r - 1][c] == true)
 37             v[r - 1][c] = false;
 38         }
 39     }
 40     if (c != (col - 1))
 41     {
 42         if (v[r][c + 1] == false)
 43         {
 44             v[r][c + 1] = true;
 45             BFS(r, c + 1, Graph[r][c + 1] + num);
 46             //if (Graph1[r][c + 1] == true)
 47             v[r][c + 1] = false;
 48         }
 49     }
 50     if (c != 0)
 51     {
 52         if (v[r][c - 1] == false)
 53         {
 54             v[r][c - 1] = true;
 55             BFS(r, c - 1, Graph[r][c - 1] + num);
 56             //if (Graph1[r][c-1] == true)
 57             v[r][c - 1] = false;
 58         }
 59     }
 60 }
 61 
 62 int main()
 63 {
 64     MaxSum = 0;
 65     char a[20];
 66     cout << "請輸入要讀入的檔案名與位址(如:D:\\test.txt):";
 67     cin >> a;
 68     ifstream infile;
 69     infile.open(a, ios::in);
 70     if (infile.is_open() == false)
 71     {
 72         cerr << "open error!" << endl;
 73         exit(1);
 74     }
 75 
 76 //    cout << "請分别輸入二維數組的行數和列數:";
 77     infile >> row;
 78     infile >> col;
 79 //    cin >> row >> col;
 80 //    cout << "請輸入二維數組資料:\n";
 81     for (int i = 0; i < row; i++)
 82     {
 83         for (int j = 0; j < col; j++)
 84         {
 85             infile >> Graph[i][j];
 86         }
 87     }
 88     for (int i = 0; i < row; i++)
 89     {
 90         for (int j = 0; j < col; j++)
 91         {
 92             v[i][j] = false;
 93         }
 94     }
 95     for (int i = 0; i < row; i++)
 96     {
 97         for (int j = 0; j < col; j++)
 98         {
 99             v[i][j] = true;
100             BFS(i, j, Graph[i][j]);
101             v[i][j] = false;
102         }
103     }
104 
105     cout << "二維數組:\n";
106     for (int i = 0; i < row; i++)
107     {
108         for (int j = 0; j < col; j++)
109         {
110             cout<< Graph[i][j]<<" ";
111         }
112         cout << endl;
113     }
114     cout << "最大聯通子數組的和:";
115     cout << MaxSum<<endl;
116     infile.close();
117     return 0;
118 }      

運作結果截圖:

最大聯通子數組(結對開發)
最大聯通子數組(結對開發)

總結:

      這次的題目比較難,借助了資料結構裡深度優先周遊的算法。

項目計劃總結:

最大聯通子數組(結對開發)

時間記錄日志:

最大聯通子數組(結對開發)

缺陷記錄日志:

最大聯通子數組(結對開發)