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

  1 #include <iostream>
  2 #include <time.h>
  3 #include<string>
  4 #include<fstream>
  5 #define M 3
  6 #define N 4
  7 using namespace std;
  8
  9 int main()
 10 {
 11     int length[100],num[M][N] = {0},visit[M][N]={0},i=0;//length[100],是把文件中的数组转化为一位数组,visit[M][N]判断联通性,0为未选中,1为选中,2为连通
 12     bool flag = 0;                                      //判断visit[M][N]是否有1存在,存在为O。
 13     int max= 0;
 14     srand(unsigned((int)time(0)));
 15     ifstream ifile("1.txt");                         //从文件中读出数组
 16     if(! ifile)
 17     {
 18         cout<<"error"<<endl;
 19     }
 20     int word;
 21     while(ifile>>word)
 22     {
 23         length[i]=word;
 24         i++;
 25     }
 26     int x=0;
 27     cout<<"从文件中读出的数组为:"<<endl;
 28     for(int i=0;i<3;i++)
 29     {
 30         for(int j=0;j<4;j++)
 31         {
 32             num[i][j]=length[x];
 33             cout<<num[i][j]<<" ";
 34             x++;
 35         }
 36         cout<<endl;
 37     }
 38     for (int i = 0;i < M;i++)
 39     {
 40         for (int j = 0;j < N;j++)
 41         {
 42              if (num[i][j] >= 0)
 43             {
 44                 visit[i][j] = 1;                           //给大于零的数进行标记
 45             }
 46         }
 47     }
 48     cout<<endl;
 49     for(int i=0;i<M;i++)                               //标记两个相邻的并且有一个负数的两个数相加,并且和为正数的那种情况
 50     {
 51         for (int j=0;j<N;j++)
 52         {
 53             if (visit[i][j] == 1)
 54             {
 55                 if (num[i+1][j]+num[i][j]>0&&visit[i+1][j] == 0)
 56                 {
 57                     visit[i+1][j]= 2;
 58                 }
 59                 if (num[i-1][j]+num[i][j]>0&&visit[i-1][j] == 0)
 60                 {
 61                     visit[i-1][j] = 2;
 62                 }
 63                 if (num[i][j-1]+num[i][j]>0&&visit[i][j-1] == 0)
 64                 {
 65                      visit[i][j-1]=2;
 66                 }
 67                 if (num[i][j+1]+num[i][j]>0 && visit[i][j+1] == 0)
 68                 {
 69                     visit[i][j+1]=2;
 70                 }
 71             }
 72         }
 73     }
 74
 75     for (int i=0;i<M;i++)
 76     {
 77         for (int j= 0;j< N;j++)
 78         {
 79             flag = 0;
 80             if (visit[i][j]!=0 &&num[i][j] < 0)
 81             {
 82                 visit[i][j] = 0;
 83                 for (int p = 0;p < M;p++)
 84                 {
 85                     for (int q= 0;q< N;q++)
 86                     {
 87                         if (visit[p][q] != 0)
 88                         {
 89                             if ((visit[p+1][q] <= 0 || visit[p+1][q] > 2)&&      //排除掉负数最小的那种情况
 90                                 (visit[p-1][q] <= 0 || visit[p-1][q] > 2)&&
 91                                 (visit[p][q+1] <= 0 || visit[p][q+1] > 2)&&
 92                                 (visit[p][q-1] <= 0 || visit[p][q-1] > 2))
 93                             {
 94                                 flag=1;
 95                             }
 96                         }
 97                     }
 98                 }
 99                 if (flag)
100                 {
101                     visit[i][j] = 2;
102                 }
103             }
104         }
105     }
106
107    for (int i = 0;i < M;i++)
108     {
109         for (int j = 0;j < N;j++)
110         {
111             if (visit[i][j] != 0)
112             {
113                max+= num[i][j];
114             }
115         }
116     }
117     cout <<"请输入这个最大联通数组的和:"<< max << endl;
118 }

一实验思路:

1.在文件中输入一个数组,并从文件中读出来
2.定义一个二维数组num[M][N],用来存放从文件中读出 的数组,二维数组visit[M][N]用来标记是否联通   
3.首先标记二维数组中的正数

4.找出正整数上下左右相邻加起来和为正的负数
 5.然后判断是否联通,将不联通的抛掉,将小的负数排除掉,最后的是最大联通子数组,最后求和。
二实验截图:

三.实验总结:在此次实验中,找最大联通子数组还是比较难的一个问题,我一开始想用图写,但是出现了许多的错误,后来转化了实验思路,但是在写的过程中还是遇到了很多的问题,请教了同学,上网查了资料,但是程序还是略微有些不足,还有一些问题,后面我会继续完善,在这次实验中我发现我懂得还是太少,以后会多学习编程的知识。

四.实验日志

项目记录 日志:


听课


编写程序


阅读相关书籍


网上查找资料


日总计


上周四


2


0


0


0


2


上周五


0


1


1


0


2


上周六


0


3


0.5


1


4.5


上周日


2


0.5


0.5


0


3


周一


0


3


0.5


1


4.5


周二


0


1


0


1


2


周三


0


2


1


0


4


周总计


4


12.5


3.5


3


21

时间记录日志


日期


开始 时间


结束时间


中断时间


净时间


活动


备注


上周四


14:00


16:00


10


100


上课


软件工程


上周五


16:00


17:00


0


60


编程


二维数组问题


19:00


20:00


0


60


阅读书籍


构建之法


上周六


12:00


16:00


60


180


编程


19:00


21:00


30


90


阅读书籍


构建之法


上周日


14:00


16:00


10


100


上课


软件工程


19:00


20:00


0


60


编程 查找资料


二维数组问题


星期一


13:00


17:00


60


180


编程


数组问题


17:00


18:00


0


60


上网


查资料


星期二


12:00


14:00


30


90


编程


数组问题


星期三


13:00


15:00


0


180


编程


数组问题二

缺陷记录日志:


日期


编号


类型


引入阶段


排除阶段


修复阶段


修复缺陷


4/3


1


二维数组转化成图


5h


在编写二维数组转化图的过程中,遍历出现了问题,总是遍历不够,然后改不出来放弃了这种思路


2


最后结果的输出


3h


在转化思路后,最后编写的程序还是有一点问题,输出的最大联通子数组偏大,有时不相邻的两个正数联通,由于时间问题,这个错误以后会改正

我的伙伴 张瑶:http://www.cnblogs.com/zhangyao999/

时间: 2024-10-02 00:24:59

返回一个二维数组中最大联通子数组的和的相关文章

课堂练习;返回一个二维数组中最大子数组的和

1.要求: 输入一个二维整形数组,数组里有正数也有负数. 二维数组首尾相接,象个一条首尾相接带子一样. 数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和. 求所有子数组的和的最大值.要求时间复杂度为O(n). 2.结对开发要求: 两人结对完成编程任务. 一人主要负责程序分析,代码编程. 一人负责代码复审和代码测试计划. 发表一篇博客文章讲述两人合作中的过程.体会以及如何解决冲突(附结对开发的工作照). 3.设计思路 (1)用键盘输入一个整形数组,数组里有正数也有负数,并把它变成环形

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

1 问题:返回一个二维整数数组中最大联通子数组的和 2 思路:对n*m的二维数组进行分解,分解为n个一维数组,再先求这n个一维数组的最大子数组和,并记下每行最大一维子数组的下标如2-5,这是就会分两种情况第一种是行之间的最大子数组是相连的,如第一行是2-5,第二行是3-6,这是直接相加就行.第二种是不相连的如第一行是2-5,第二行是6-7,这时候就把每行的最大子数组看成一个整体,再使每个最大数组块进行相连,求使其相连的最小代价.最后就可求出最大联通子数组的和. 3 代码 #include<ios

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

返回一个二维整数数组中最大联通子数组的和 题目: 输入一个二维整形数组,数组里有正数也有负数. 求所有子数组的和的最大值. 思路: (方法一)首先若要对二维数组进行分析,通常想要把它化简成为一个一维数组.再先求每个一维数组的最大子数组和,并记下每行最大一维子数组的下标.这是就会分两种情况:第一种是行之间的最大子数组是相连的,这时就可以直接相加得到:第二种是不相连的,,这时候就把每行的最大子数组看成一个整体,再使每个最大数组块进行相连,求使其相连的最小代价.最后得到的就是最大联通子数组的和. (方

求二维整数数组中最大联通子数组的和

1 问题:返回一个二维整数数组中最大联通子数组的和 2 思路:对n*m的二维数组进行分解,分解为n个一维数组,再先求这n个一维数组的最大子数组和,并记下每行最大一维子数组的下标如2-5,这是就会分两种情况第一种是行之间的最大子数组是相连的,如第一行是2-5,第二行是3-6,这是直接相加就行.第二种是不相连的如第一行是2-5,第二行是6-7,这时候就把每行的最大子数组看成一个整体,再使每个最大数组块进行相连,求使其相连的最小代价.最后就可求出最大联通子数组的和. 3 代码 1 #include<i

c语言:将一个二维数组行和列的元素互换,存到另一个二维数组中。

将一个二维数组行和列的元素互换,存到另一个二维数组中. 解:程序: #include<stdio.h> int main() { int i, j, a[2][3] = { {1,2,3},{4,5,6} },b[3][2]; printf("array a:\n"); for (i = 0; i <=1; i++)//处理a数组中的一行中各元素 { for (j = 0; j <= 2; j++)//处理a数组中的某一列元素 { printf("%5

二维数组求最大连通子数组的和

题目:返回一个二维整数数组中最大联通子数组的和. 要求: 输入一个二维整形数组,数组里有正数也有负数. 求所有子数组的和的最大值. 程序要使用的数组放在一个叫 input.txt 的文件中, 文件格式是: 数组的行数, 数组的列数, 每一行的元素, (用逗号分开) 每一个数字都是有符号32位整数,当然,行数和列数都是正整数. 源程序 /* 设计思路: 1.首先从文件读入一个二维整型数组(有正有负): 2.从数组中选出最小的一个数,如果为负数则除去,检验联通性: 3.联通,接下来找剩余中最小的数,

结对开发之返回一个二维整数数组中最大联通子数组的和

一.题目要求 输入一个二维整形数组,数组里有正数也有负数.二维数组首尾相接,象个一条首尾相接带子一样.数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和.求所有子数组的和的最大值.要求时间复杂度为O(n)题目:返回一个二维整数数组中最大子数组的和 二.解题思路 先对二维数组进行了重构,形成一个环状二维数组,然后再用求二维数组子矩阵最大和的方法求得最终结果. 三.程序代码 2 #include<iostream.h> 3 int main(int argc, char* argv[]

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

题目: 输入一个二维整形数组,数组里有正数也有负数. 求所有子数组的和的最大值. 要求: 两人结对完成编程任务. 一人主要负责程序分析,代码编程. 一人负责代码复审和代码测试计划. 发表一篇博客文章发表一篇博客文章讲述设计思想,出现的问题,可能的解决方案(多选).源代码.结果截图.总结. 思想: 在看到本题目后,想了很久也没有想到比较满意的解决方法,觉得题目比较难,超出了我的能力范围.不过,个人认为可能用到了图论的知识,但是学的不好.根据上图给定的二维数组求解最大联通数组也许比较简单.以一个非负

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

一.题目 输入一个二维整形数组,数组里有正数也有负数. 求所有子数组的和的最大值. 二.设计思想 方法一:首先若要对二维数组进行分析,之前我们已经做过关于一位数组的练习,所以我们可以把它化简成为一个一维数组.再先求每个一维数组的最大子数组和,并记下每行最大一维子数组的下标.这是就会分两种情况:第一种是行之间的最大子数组是相连的,这时就可以直接相加得到:第二种是不相连的,,这时候就把每行的最大子数组看成一个整体,再使每个最大数组块进行相连,求使其相连的最小代价.最后得到的结果就是最大联通子数组的和