返回一个二维数组中最大联通子数组的和
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了返回一个二维数组中最大联通子数组的和相关的知识,希望对你有一定的参考价值。
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/
以上是关于返回一个二维数组中最大联通子数组的和的主要内容,如果未能解决你的问题,请参考以下文章