1.设计思想
起初看到这个题目让我想到了去年暑假我们小学期的大作业:校园导航设计程序返回游览学校全部景点的最大路径,我把去年的程序翻出来认真的思考了一下,这道题也可以根据使用将矩阵转化为图的思路。将二维矩阵转换成图的存储形式,当两个相邻的数之间联通的时长度为1,否则就是0;每个点都遍历一遍,同一维数组一样当和小于0时重新计算,当和大于最大和时刷新最大值。选取已遍历的联通子数组周围最大值遍历。
2.源程序代码
1 #include<iostream> 2 #include<fstream> 3 using namespace std; 4 typedef struct 5 { 6 int b[50]; 7 int a[50][50]; 8 int n; 9 }G; 10 void Traverse(G &p, int v, int visit[], int &b, int &max, int x) 11 { 12 visit[v]=1; 13 max += p.b[v]; 14 if (max>=b) 15 { 16 b=max; 17 } 18 int a=0, flag=0; 19 for (int w=1; w<=p.n;w++) 20 { 21 for (int c=1;c<= p.n;c++) 22 { 23 if ((visit[w]==0)&&(p.a[c][w]==1)&&(visit[c]==1)) 24 { 25 a=w; 26 flag=1; 27 break; 28 } 29 } 30 if (flag==1) 31 { 32 break; 33 } 34 } 35 for (int w=1;w<=p.n;w++) 36 { 37 for (int c=1;c<=p.n;c++) 38 { 39 if ((visit[w] == 0) && (p.a[c][w] == 1) && (visit[c] == 1)) 40 { 41 if (p.b[a]<p.b[w]) 42 a = w; 43 } 44 } 45 } 46 if (b+p.b[a]<0) 47 { 48 p.a[v][a] = 0; 49 } 50 else 51 Traverse(p, a, visit, b, max, x); 52 } 53 int main() 54 { 55 int x, y; 56 ifstream infile("input.txt"); 57 infile>>x; 58 infile>>y; 59 G p; 60 p.n = x*y; 61 for (int i = 1; i <= p.n; i++) 62 { 63 infile>>p.b[i]; 64 } 65 for (int i=1;i<=p.n;i+= y) 66 { 67 for (int j=i;j<=i+y-2;j++) 68 { 69 p.a[j][j+1]=1; 70 p.a[j+1][j]=1; 71 } 72 } 73 for (int i=1+y;i<p.n;i+=y) 74 { 75 for (int j=i;j<=i+x - 1;j++) 76 { 77 p.a[j][j - y] = 1; 78 p.a[j - y][j] = 1; 79 } 80 } 81 int v=1, b[50] = {0}, h = 0; 82 for (int i=1;i<=p.n;i++) 83 { 84 if (p.b[i]<0) 85 { 86 b[i] = p.b[i]; 87 } 88 else 89 { 90 int visit[50] = { 0 }; 91 int max = 0; 92 Traverse(p, i, visit, b[i], max, x); 93 } 94 } 95 int max = b[1]; 96 for (int i = 2; i <= p.n; i++) 97 { 98 if (b[i]>max) 99 max = b[i]; 100 } 101 cout<<"二维整数数组中最大联通子数组的和为:" <<max<<endl; 102 }
3.运行结果截图
4.开发过程
最开始看到题目的时候我们是没有思路的,经过我们组的讨论和联想,我们想到了相似的问题:数据结构中求最优路径
我们拿出以前的编写过的程序做了一下比较发现思路可行
由于数据结构已经非常生疏了我们通过对原程序的修改找到感觉,最后重新编写出适合这个题目的程序
5.计划日志
日期&&任务 | 听课 | 编写程序 | 阅读相关书籍 | 网上查找资料 | 日总计 |
周一 | 100 | 25 | 25 | 15 | 165 |
周二 | 30 | 35 | 25 | 90 | |
周三 | 60 | 15 | 35 | 110 | |
周四 | 100 | 30 | 30 | 25 | 185 |
周五 | 180 | 15 | 195 | ||
周六 | 60 | 15 | 75 | ||
周日 | 15 | 15 | |||
周总计 | 200 | 325 | 180 | 130 | 835 |
6.时间记录日志
日期 | 开始时间 | 结束时间 | 中断时间 | 净时间 | 活动 | 备注 |
3/28 | 14:00 | 15:50 | 10 | 100 | 听课 | 软件工程上课 |
17:10 | 17:20 | 10 | 阅读书籍 | 《构建之法》 | ||
21:00 | 21:25 | 20 | 网上查找资料 | |||
3/29 | 14:00 | 15:00 | 10 | 110 | 结对编程 | 编写老师布置的作业 |
16:00 | 17:00 | 10 | 110 | 看书 | 《构建之法》 | |
3/30 | 21:00 | 21:30 | 30 | 结对编程 | 编写老师布置的作业 | |
3/31 | 14:00 | 15:50 | 10 | 100 | 听课 | 软件工程上课 |
4/3 | 16:00 | 18:00 | 120 | 结对编程 | 编写老师布置的作业 | |
4/4 | 9:00 | 9:30 | 30 | 看书 | 《人月神话》 | |
4/5 | 9:00 | 9:30 | 30 | 看书 | 《人月神话》 |
7.缺陷记录日志
日期 | 编号 | 类型 | 引入阶段 | 排除阶段 | 修复时间 | 修复缺陷 |
3月29日 | 1 | 编码 | 编码 | 0.2min | ||
编写子函数出现调用错误 | ||||||
2 | 编码 | 运行 | 3min | |||
文件输入输出流运用错误 | ||||||
4月3日 | 3 | 编码 | 编译 | 20min | ||
程序逻辑错误 |
组员:刘伟:http://www.cnblogs.com/Lw-1573/
附: