首页 > 技术文章 > 最大子数组三

zhangyao999 2016-04-06 16:45 原文

  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/LUXIN123

推荐阅读