题目:返回一个二维整数数组中最大联通子数组的和。
要求:
文件读入数组。
结对开发的伙伴:
博客名: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 << "请输入二维数组数据: "; 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 << "二维数组: "; 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 }
运行结果截图:
总结:
这次的题目比较难,借助了数据结构里深度优先遍历的算法。
项目计划总结:
时间记录日志:
缺陷记录日志: