您的位置:首页 > 其它

返回一个二维整数数组中最大联通子数组的和

2016-04-06 18:11 197 查看
1.设计思想

起初看到这个题目让我想到了去年暑假我们小学期的大作业:校园导航设计程序返回游览学校全部景点的最大路径,我把去年的程序翻出来认真的思考了一下,这道题也可以根据使用将矩阵转化为图的思路。将二维矩阵转换成图的存储形式,当两个相邻的数之间联通的时长度为1,否则就是0;每个点都遍历一遍,同一维数组一样当和小于0时重新计算,当和大于最大和时刷新最大值。选取已遍历的联通子数组周围最大值遍历。

2.源程序代码

#include<iostream>
#include<fstream>
using namespace std;
typedef struct
{
int b[50];
int a[50][50];
int n;
}G;
void Traverse(G &p, int v, int visit[], int &b, int &max, int x)
{
visit[v]=1;
max += p.b[v];
if (max>=b)
{
b=max;
}
int a=0, flag=0;
for (int w=1; w<=p.n;w++)
{
for (int c=1;c<= p.n;c++)
{
if ((visit[w]==0)&&(p.a[c][w]==1)&&(visit[c]==1))
{
a=w;
flag=1;
break;
}
}
if (flag==1)
{
break;
}
}
for (int w=1;w<=p.n;w++)
{
for (int c=1;c<=p.n;c++)
{
if ((visit[w] == 0) && (p.a[c][w] == 1) && (visit[c] == 1))
{
if (p.b[a]<p.b[w])
a = w;
}
}
}
if (b+p.b[a]<0)
{
p.a[v][a] = 0;
}
else
Traverse(p, a, visit, b, max, x);
}
int main()
{
int x, y;
ifstream infile("input.txt");
infile>>x;
infile>>y;
G p;
p.n = x*y;
for (int i = 1; i <= p.n; i++)
{
infile>>p.b[i];
}
for (int i=1;i<=p.n;i+= y)
{
for (int j=i;j<=i+y-2;j++)
{
p.a[j][j+1]=1;
p.a[j+1][j]=1;
}
}
for (int i=1+y;i<p.n;i+=y)
{
for (int j=i;j<=i+x - 1;j++)
{
p.a[j][j - y] = 1;
p.a[j - y][j] = 1;
}
}
int v=1, b[50] = {0}, h = 0;
for (int i=1;i<=p.n;i++)
{
if (p.b[i]<0)
{
b[i] = p.b[i];
}
else
{
int visit[50] = { 0 };
int max = 0;
Traverse(p, i, visit, b[i], max, x);
}
}
int max = b[1];
for (int i = 2; i <= p.n; i++)
{
if (b[i]>max)
max = b[i];
}
cout<<"二维整数数组中最大联通子数组的和为:" <<max<<endl;
}


3.运行结果截图





4.开发过程

最开始看到题目的时候我们是没有思路的,经过我们组的讨论和联想,我们想到了相似的问题:数据结构中求最优路径

我们拿出以前的编写过的程序做了一下比较发现思路可行

由于数据结构已经非常生疏了我们通过对原程序的修改找到感觉,最后重新编写出适合这个题目的程序

5.计划日志

日期&&任务听课编写程序阅读相关书籍网上查找资料日总计
周一100252515165
周二30352590
周三601535110
周四100303025185
周五18015195
周六601575
周日1515
周总计200325180130835
6.时间记录日志

日期开始时间结束时间中断时间净时间活动备注
3/2814:0015:5010100听课软件工程上课
17:1017:2010阅读书籍《构建之法》
21:0021:2520网上查找资料
3/2914:0015:0010110结对编程编写老师布置的作业
16:0017:0010110看书《构建之法》
3/3021:0021:3030结对编程编写老师布置的作业
3/3114:0015:5010100听课软件工程上课
4/316:0018:00120结对编程编写老师布置的作业
4/49:009:3030看书《人月神话》
4/59:009:3030看书《人月神话》
7.缺陷记录日志

日期编号类型引入阶段排除阶段修复时间修复缺陷
3月29日1编码编码0.2min
编写子函数出现调用错误
2编码运行3min
文件输入输出流运用错误
4月3日3编码编译20min
程序逻辑错误
组员:刘伟:http://www.cnblogs.com/Lw-1573/

附:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: