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


    1.设计思想

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

    2.源程序代码

      1 #include<iostream>
      2 #include<fstream>
      3 using namespace std;
      4 typedef struct
      5 {
      6     int b[50];
      7     int a[50][50];
      8     int n;
      9 }G;
     10 void Traverse(G &p, int v, int visit[], int &b, int &max, int x)   
     11 {
     12     visit[v]=1;
     13     max += p.b[v];
     14     if (max>=b)
     15     {       
     16         b=max;
     17     }
     18     int a=0, flag=0;
     19     for (int w=1; w<=p.n;w++)
     20     {
     21         for (int c=1;c<= p.n;c++)
     22         {
     23             if ((visit[w]==0)&&(p.a[c][w]==1)&&(visit[c]==1))
     24             {
     25                 a=w; 
     26                 flag=1; 
     27                 break;
     28             }
     29         }
     30         if (flag==1)
     31         {           
     32             break;
     33         }
     34     }
     35     for (int w=1;w<=p.n;w++)
     36     {
     37         for (int c=1;c<=p.n;c++)
     38         {
     39             if ((visit[w] == 0) && (p.a[c][w] == 1) && (visit[c] == 1))
     40             {
     41                 if (p.b[a]<p.b[w])
     42                     a = w;
     43             }
     44         }
     45     }
     46     if (b+p.b[a]<0)
     47     {
     48         p.a[v][a] = 0;
     49     }
     50     else
     51         Traverse(p, a, visit, b, max, x);
     52 }                                                                                                                 
     53 int main()                            
     54 {
     55     int x, y;
     56     ifstream infile("input.txt");
     57     infile>>x;
     58     infile>>y;
     59     G p;
     60     p.n = x*y;
     61     for (int i = 1; i <= p.n; i++)
     62     {
     63         infile>>p.b[i];
     64     }                                      
     65     for (int i=1;i<=p.n;i+= y)
     66     {
     67         for (int j=i;j<=i+y-2;j++)
     68         {
     69             p.a[j][j+1]=1;
     70             p.a[j+1][j]=1;
     71         }
     72     }
     73     for (int i=1+y;i<p.n;i+=y)
     74     {
     75         for (int j=i;j<=i+x - 1;j++)
     76         {
     77             p.a[j][j - y] = 1;
     78             p.a[j - y][j] = 1;
     79         }
     80     } 
     81     int v=1, b[50] = {0}, h = 0;
     82     for (int i=1;i<=p.n;i++)
     83     {
     84         if (p.b[i]<0)
     85         {
     86             b[i] = p.b[i];
     87         }
     88         else
     89         {
     90             int visit[50] = { 0 };
     91             int max = 0;
     92             Traverse(p, i, visit, b[i], max, x);
     93         }
     94     }
     95     int max = b[1];
     96     for (int i = 2; i <= p.n; i++)
     97     {
     98         if (b[i]>max)
     99             max = b[i];
    100     }
    101     cout<<"二维整数数组中最大联通子数组的和为:" <<max<<endl;
    102 }

    3.运行结果截图

    4.开发过程

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

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

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

    5.计划日志

    日期&&任务 听课 编写程序 阅读相关书籍 网上查找资料 日总计
    周一 100 25 25 15 165
    周二   30 35 25 90
    周三   60 15 35 110
    周四 100 30 30 25 185
    周五   180   15 195
    周六     60 15 75
    周日     15   15
    周总计 200 325 180 130 835

    6.时间记录日志

    日期 开始时间 结束时间 中断时间 净时间 活动 备注
    3/28 14:00 15:50 10 100 听课 软件工程上课
      17:10 17:20   10 阅读书籍 《构建之法》
      21:00 21:25   20 网上查找资料  
    3/29 14:00 15:00 10 110 结对编程 编写老师布置的作业
      16:00 17:00 10 110 看书 《构建之法》
    3/30 21:00 21:30   30 结对编程 编写老师布置的作业
    3/31 14:00 15:50 10 100 听课 软件工程上课
    4/3 16:00 18:00   120 结对编程 编写老师布置的作业
    4/4 9:00 9:30   30 看书 《人月神话》
    4/5 9:00 9:30   30 看书 《人月神话》

    7.缺陷记录日志

    日期 编号 类型 引入阶段 排除阶段 修复时间 修复缺陷
    3月29日 1   编码 编码 0.2min  
      编写子函数出现调用错误
      2   编码 运行 3min  
      文件输入输出流运用错误
    4月3日 3   编码 编译 20min  
      程序逻辑错误

    组员:刘伟:http://www.cnblogs.com/Lw-1573/

    附:

  • 相关阅读:
    北风设计模式课程---22、责任链模式
    bootstarp modal自己主动调整宽度的JS代码
    谷歌技术面试要点(Google面试)(14年5月20日交大专场)
    ASCII与Unicode编码消息写文件浅析
    程序编写中的细节问题
    Oracle使用并行建索引须要注意的问题
    PHP读取Excel里的文件
    Oracle db中 CONNECT role的含义
    集团信息化之路—电子採购软件与现有库存及財务软件数据对接的探讨
    NTP方式保证以时间戳同步可靠性
  • 原文地址:https://www.cnblogs.com/jiajun1/p/5360476.html
Copyright © 2020-2023  润新知