您的位置:首页 > 其它

求数组中最大子数组的和03

2016-04-06 17:19 218 查看
  题目:返回一个二维整数数组中的最大连通子数组的和

  要求:输入一个二维整形数组,有正数、有负数;

     求所有子数组的和的最大值。

  设计思路:刚看到这个题目时,说实话,确实一点儿思路都没有,后来听同学去讲台上讲思路,经过课下结合之前学过的知识和队友讨论了讨论,捋清了基本思路,大致如下:利用遍历的思想,以及寻找路径的方法,在遍历二维数组中按照优化思想逐个找出理想的数值相加,按照最小代价直到选出二维数组中最大的子数组的和为止。

  源代码:

//结对开发成员;张晓菲 张哲
//本次实验题目为:求二维数组中的最大连通子数组的和
#include<iostream>
#include<ctime>
#include<fstream>
using namespace std;
#define N 100

typedef struct
{
int array
;
int col

;
int countnum;
}Struct;//定义结构体变量

void input(Struct &num, int x, int y)
{//input用于实现从文件中读取行和列并输出到屏幕上
num.countnum = x*y;
int i = 1;
int a, b;
ifstream in = ifstream("input.txt");
in >> a;
in >> b;
num.countnum = a*b;
while (in >> num.array[i])
{//将in文件中的数字读取到数组中
++i;
}
in.close();//读取完毕关闭文件in
for (int i = 1; i <= num.countnum; i++)
{
cout << num.array[i] << " ";
if (i%b == 0)
{
cout << endl;
}
}//输出文件导入的数组到屏幕
for (int i = 1; i <= num.countnum; i += y)
{
for (int j = i; j <= i + y - 2; j++)
{
num.col[j][j + 1] = 1;
num.col[j + 1][j] = 1;
}
}
for (int i = 1 + y; i<num.countnum; i += y)
{
for (int j = i; j <= i + x - 1; j++)
{
num.col[j][j - y] = 1;
num.col[j - y][j] = 1;
}
}
}

void traverse(Struct &num, int v, int visit[], int &b, int &max, int x)
{//通过对数组的遍历寻找最大连通子数组
int a = 0, var = 0;
visit[v] = 1;
max += num.array[v];
if (max >= b)
{
b = max;
}
for (int w = 1; w <= num.countnum; w++)
{
for (int c = 1; c <= num.countnum; c++)
{
if ((visit[w] == 0) && (num.col[c][w] == 1) && (visit[c] == 1))
{
a = w;
var = 1;
break;
}
}
if (var == 1)
break;
}
for (int w = 1; w <= num.countnum; w++)
{
for (int c = 1; c <= num.countnum; c++)
{
if ((visit[w] == 0) && (num.col[c][w] == 1) && (visit[c] == 1))
{
if (num.array[a]<num.array[w])
a = w;
}
}
}
if (b + num.array[a]<0)
{
num.col[v][a] = 0;
}
else
traverse(num, a, visit, b, max, x);
}

int main()
{
int x, y;
fstream fs("input.txt");
fs >> x;
fs >> y;
cout << x << " " << y << endl;
Struct num;
input(num, x, y);
int v = 1, b
= { 0 }, h = 0;
for (int i = 1; i <= num.countnum; i++)
{
if (num.array[i]<0)
{
b[i] = num.array[i];
}
else
{
int visit
= { 0 };
int max = 0;
traverse(num, i, visit, b[i], max, x);
}
}

int max = b[1];
for (int i = 2; i <= num.countnum; i++)
{
if (b[i]>max)
max = b[i];
}
cout << "该数组中最大连通子数组的和为:" << max << endl;
}


View Code
运行结果截图:





时间计划日志:

  本打算每天花两个小时的时间把最大连通子数组的和这个程序写出来,实际平均每天用的时间要比这个多一点点。

缺陷记录日志:

  没有判断文件中如果是非整数或者非数字该如何处理。

时间记录日志:

日期开始时间结束时间中断时间(min)净时间(min)活动备注
3月28号

星期一

14:0015:5010(课间)100上课软件工程
3月29号

星期二

20:0022:000120编程四则运算网页版
3月30号

星期三

15:0017:0010(休息)110编程四则运算网页版
20:0022:1010120编程四则运算网页版
3月31号

星期四

14:0015:5010(课间)100上课软件工程
20:3022:0010(休息)80编程最大连通子数组和
4月2号

星期六

14:0017:0020(休息)160编程四则运算网页版
4月3号

星期日

14:3018:0030180编程四则运算网页版

4月4号

星期一

19:3022:300180编程四则运算网页版

4月5号

星期二

8:0010:000120编程最大连通子数组和

19:3023:000210编程四则运算网页版

4月6号

星期三

14:2017:100150编程最大连通子数组和

最大连通子数组和

整理、发博客

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