一、设计思想
这次我们的题目是返回一个二维整数数组中最大联通子数组的和,在之前的基础上加了最大联通的要求。一开始是想沿用之前二维数组找矩阵最大子数组的方法,将其降维,变成一维数组之后再利用动态规划的方法找出整个二维数组的最大子数组,但是考虑到最大联通的多变性使得矩阵不容易确定,后来想起了老师在课堂上提出的另一个方法,利用图论的方法,之前在我们数据结构和离散数学课本中都有讲过,因此我们将这种方法作为了这次实验的突破点。
这次实验的核心思想和算法就是图论中的遍历思想,以及寻找路径的方法,在遍历中在二维数组中按照优化逐个找出理想的数值相加然后比较后存入maxarray中,按照最小代价直到选出二维数组中最大的子数组的和为止。
题目的另一个要求要有文件导入,在本次实验中实现了这个功能,用到了fstream文件输入流,方法就是写入,显示到屏幕,存入一位数组再进行遍历最后将结果显示到屏幕上,当然用户也可以选择在屏幕上输入。
这次实验的缺点就是input.txt中二维数组中的数据只能是一位整数,因为中间有int和char的转换问题,以及循环截止的问题,因此文件的改动是有限制的,由于时间问题没有进行完善。
二、出现的问题
在进行遍历算法求最大联通子数组和最大值的时候,在定义了数组之后,在多个函数中使用时它的引参问题,使得程序运行过程中老是出现中断的问题。后来通过结构体解决了这个问题。
在进行文件导入,用到文件输入流时,用到了字符串写入,在编写这部分程序时在字符串存入结构体时遇到了一些问题,通过判断字符串类型解决了这个问题。
三、源程序
#include <iostream> using namespace std; #define length1 3 #define length2 5 //*****找出最大值***** int Largest(int list[],int length) { int i,max=list[0]; for(i=0;i<length;i++) { if(list[i]>max) { max=list[i]; } } return max; } int main(int argc, char* argv[]) { int max1,max2,i; int list1[length1];//={10,22,62,45,28,0,-78,-5,3,10}; int list2[length2];//={-5,-4,-3,-2,-1}; cout<<"请输入"<<length1<<"个数:"; for(int i=0;i<length1;i++) cin>>list1[i]; cout<<"请输入"<<length2<<"个数:"; for(i=0;i<length2;i++) cin>>list2[i]; max1=Largest(list1,length1); max2=Largest(list2,length2); cout<<endl<<"list1:"; for(i=0;i<length1;i++) cout<<list1[i]<<" "; cout<<endl<<"最大值:"<<max1<<endl; cout<<"list2:"; for(i=0;i<length2;i++) cout<<list2[i]<<" "; cout<<endl<<"最大值:"<<max2<<endl<<endl; return 0; }
四、实验截图