zoukankan      html  css  js  c++  java
  • 最大子数组三

      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

  • 相关阅读:
    JavaScript常用设计模式
    js 判断l对象类型
    JavaScript编程(终极篇)
    微信小程序开发-滑动操作
    解决Jquery向页面append新元素之后事件的绑定问题
    C# list与数组互相转换
    C# “贝格尔”编排法
    C#数字格式化
    SQL从一个表查询数据插入/更新到另一个表
    全局唯一标识符 (GUID)
  • 原文地址:https://www.cnblogs.com/zhangyao999/p/5359966.html
Copyright © 2011-2022 走看看