数据结构课程设计报告
组员人数:2
题目数:2
姓名: 学号:200925503230 姓名:
学号:200925503204
题目1:熊猫烧香
算法程序设计:测试与报告:
题目2:室内布线
算法程序设计:测试与报告:
班级: 计093-2 总分:
班级: 计093-2 总分:
分数:
分数:
分数: 分数:
日期:20xx年12月31日
第一部分 数据结构课程设计题目一:搜索算法效率比较
一、 课程设计内容
现在某实验室感染了熊猫烧香病毒。实验室的机器排列为一个M行N列的矩阵,每台机器只和它相邻的奇迹直接相连(横向和纵向)。开始时有T台机器被感染,每台遭遇的熊猫变种类型都不同,分别及为K1,K2,…KT。每台机器都具有一等级别的防御能力,将防御级别记为L (0<L<1000)。熊猫烧香按照下列规则传播:
? 病毒只能从一台被感染的机器传到另一台没有被感染的机器。
? 如果一台机器已经被某个变种的病毒感染过,就不能被其他变种感染。
? 病毒的传播能力每天都在增强。第1天,病毒只能感染它可以到达的,防御级别不超过1的机器,而防
御级别大于1的机器可以阻止它从自己出继续传播。第D天,病毒只能感染它可以到达的,防御级别不超过D的机器,而防御级别大于D的机器可以阻止它从自己出继续传播。
? 在同一天之内,K1变种的病毒先开始传播,感染所有它可能感染的机器,然后是K2变种,K3变种……
依次进行传播。
本题目的任务是:当整个网络被感染后,计算有多少台机器被某个特定变种所感染。
二、 数据结构与算法设计
1、 数据结构
定义图结构 存放二维数组
图节点的定义如下:
typedef struct VertexType //节点信息
{
int day;//第几天感染的
int dl;//防御级别
int r,c;//行列号
int vt;// 病毒类型
图定义如下:
typedef struct MGraph
{
VertexType m[MAXNODE][MAXNODE];
int row,colum ,num;//行列数,感染的数目
}MGraph;
2、 主要算法
(1)最终矩阵的生成函数:四重循环函数 通过两个WHILE实现病毒全部感染前天数的循环和病毒种类的循环。通过两个FOR函数实现图节点中和病毒种类相同的节点,运行图广度查找并感染四周节点函数。
(2)感染函数(运用图的广度优先遍历查找):
建立队列,定义头尾指针。队列初始为空,从输入的节点开始,将节点入队。在队列不空的前提下,反复将对头出队,将该节点的四个方向相邻节点入队并判断能否感染,并实施感染。
三、 程序实现
介绍实现算法所编制的程序,包括头文件和源文件。简要说明个文件的功能
MGraph.h 记录了矩阵图和图节点的数据结构 MGraph。
Suanfa.h 记录了最终矩阵生产函数和感染函数。
main.cpp 实现算法的主程序。
四、 测试结果
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
测试输入:1 -3 -2 -3 -2 -1 -2 2 -3 -2 -1 -1 1; 测试目的:输入3*4矩阵 和病毒类型 验证能否输出正确感染相应病毒机器个数和原输入矩阵。 正确输出:你的输入为 1 -3 -2 -3 -2 -1 -2 2 -3 -2 -1 -1 病毒类型为1的病毒个数为9 实际输出:你的输入为 1 -3 -2 -3 -2 -1 -2 2 -3 -2 -1 -1 病毒类型为1的病毒个数为9 当前状态:通过
五、 分析与探讨
1. 测试结果分析。解释测试策略,对得到的结果进行分析,总结出算法的时间和空间
复杂度,对算法的性能进行评价:
测试结果正确实现算法功能。实现病毒感染天数和病毒感染天数的预测和输出结果。
病毒感染函数的时间复杂度是O(n2)。
2. 探索算法改进的可能性,提出自己的建议:
(1病毒感染算法空间复杂度有缩小空间。可尝试放弃图的广度优先遍历使用其他算法。
(2图的定义复杂 可以适当简化。
第二部分:数据结构课程设计题目二:室内布线
一:课程设计题目:
最小生成树:室内布线
1. 题目要求
编写程序帮助房主世界室内电线的布局。
首先,墙上的插座是固定的。插座间需要有电线相连,而且要布置的整齐美观,即要求每条线都至少与一条墙边平行,且嵌入四壁或者地板(不能走屋顶)。另外,每个房间都有们,电线不可以穿门而过。要求将所有的插座连通,且告诉房主需要买的电线的最短长度。
输入要求:
输入有若干组测试数据组成。每组数据的第1行包含房间的长宽高和插座的个数N<=20。接下去的N行中,第i行给出第i个插座的位置坐标(xi, yi, zi),最后一行包含4个3元组,分别是长方形门框的4个交的三位坐标。4个整数全部为0表示全部测试结束。
注:房间是长方体,位于三维指教坐标系的第一象限内,并且有一个角落在原点上。地板位于xy平面,插座位于墙上,门上没有插座。要求每段线段的两端仅与插座相连,电线之间不能互相连接。
输出要求:
对每一组测试,在一行里输出将所有插座连通需要买的电线的最短整数长度。
输入例子:
10 10 10 4
0 1 3.3
2.5 0 2
5 0 0.8
5 10 1
0 0 0 0 0 3 1.5 0 0 1.5 0 3
0 0 0 0
输出例子:
21
2. 简要提示
可以将每个插座看成图中的一个结点,计算出任意两插座之间的最短距离,作为两结点间边的权重。要求的布线结果是一个保证连通的子图,其中包括边的权重和最小,这实际上是一个最小生成树,可以用求最小生成树的算法解决。
构建图的过程比较复杂,因为图中任意两点间都有边,所以采用邻接矩阵表示图较好。
构建图的过程比较复杂,为了方便计算两插座间的最短距离,每个插座除了要在数据结构中记录坐标外,还需要判断它属于哪一面墙,为此建议增加墙的编号。两插座的分布情况:在同一面墙,相邻的两面墙,在对面的墙。还要考虑是否有门。
输出时要输出的整数长度要上取。
二:数据结构与算法设计
结构体:typedef struct CZ (CZ即插座的意思)
{//定义插座结构体
int m; //m为插座所在墙(xz面为1;yz面为2;对xz面为3;对yz面为4) float x,y,z; //x,y,z分别为插座的三个坐标
}CZ;
全局数组:float MIN[20][20]; //定义全局矩阵存放每两个插座之间的最短连线
主函数:void main()
{
CZ CZ[20];
int L,W,H,N;
T: cout<<"请输入房间长宽高及插座数:";
cin>>L>>W>>H>>N; //L,W,H即X,Y,Z方向坐标
cout<<endl;
for(int i=0;i<N;i++)
{
cout<<"请输入第"<<i+1<<"个插座所在墙面及坐标: ";
T2: cin>>CZ[i].m>>CZ[i].x>>CZ[i].y>>CZ[i].z;
if(CZ[i].m>4||CZ[i].x>L||CZ[i].y>W||CZ[i].z>H)
{
cout<<"输入数据错误!重新输入: ";
goto T2;
}
}
cout<<endl;
Count(N,L,W,CZ); //计算每两个插座间最短连线
cout<<"最短连线为:"<<Calculate(N,MIN)<<endl<<endl;
goto T;
}
思路与算法实现 :首先根据提示输入房间的长宽高和插座总数N,然后输入各个插座坐标及所在面(事先给每面墙编上号),输入数据错误则重新输入,坐标全部输入后调用Count函数计算每两个插座间连线的最短连线,并把连线的长度存入全局变量数组中,(计算两插座间最短连线分同面墙、临面墙和对面墙三种,同面墙和临面墙计算相似,对面墙有三种连线方式,调用Compare函数通过比较求得最短连线,其中以防距离有负数,在有可能出现负数的地方调用Contrary函数,正数不变负数取反),计算完之后调用Calculate函数(该函数实际是贪心算法即Dijkstra算法),计算所得对称矩阵即邻接矩阵的最小连通图权值之和,由于是对称的,计算了两遍,返回结果除以二即所有插座间连线的最短值。
实用性即:新建一房子,长宽高知道,量出所有插座坐标,输入程序即可得出电线的最少值,买电线时就可以花最少的钱。
三:程序实现
其中求每两个插座最短连线为:
for(int i=0;i<N;i++)
{
for(int j=0;j<N;j++)
{
if((CZ[i].m==CZ[j].m) //同面或临面墙
||(CZ[i].m==1&&CZ[j].m==2)||(CZ[i].m==2&&CZ[j].m==1)
||(CZ[i].m==1&&CZ[j].m==4)||(CZ[i].m==4&&CZ[j].m==1)
||(CZ[i].m==2&&CZ[j].m==3)||(CZ[i].m==3&&CZ[j].m==2)
||(CZ[i].m==3&&CZ[j].m==4)||(CZ[i].m==4&&CZ[j].m==3))
{
p1=CZ[i].x-CZ[j].x;p2=CZ[i].y-CZ[j].y;p3=CZ[i].z-CZ[j].z;
p1=Contrary(p1);p2=Contrary(p2);p3=Contrary(p3);
MIN[i][j]=p1+p2+p3;
}
else //对面墙
{
if((CZ[i].m==1&&CZ[j].m==3)||(CZ[i].m==3&&CZ[j].m==1))
{
p1=CZ[i].x;p2=CZ[j].x;p3=W;
a=p1+p2+p3;
p1=CZ[i].z;p2=CZ[j].z;p3=W;
b=p1+p2+p3;
p1=L-CZ[i].x;p2=L-CZ[j].x;p3=CZ[i].z-CZ[j].z;p3= Contrary(p3); c=p1+p2+p3;
MIN[i][j]=Compare(a, b,c); //找出最短连线
}
else
if((CZ[i].m==2&&CZ[j].m==4)||(CZ[i].m==4&&CZ[j].m==2))
{
p1=CZ[j].y;p2=CZ[i].y;p3=L;
a=p1+p2+p3;
p1=CZ[i].z;p2=CZ[j].z;p3=L;
b=p1+p2+p3;
p1=W-CZ[j].y;p2=W-CZ[i].y;p3=L;
c=p1+p2+p3;
MIN[i][j]=Compare(a, b,c);
}
}
Calculate函数为:
float Calculate(int N,float MIN[20][20])
{//计算最短路径
float M=0,min=MIN[0][0],k; //min为每一遍查找的最短连接长度,k为循环次数 for(k=0;k<N;k++)
{
for(int i=0;i<N;i++)
{
for(int j=0;j<N,min>0,MIN[i][j]>0;j++)
{
if(min<MIN[i][j])
min=MIN[i][j];
MIN[i][j]=0;
}
}
M+=min; //总连线最短长度
}
return M/2; //所得矩阵为对称矩阵,数据加了两边
}
四:测试结果
测试过程是在草稿纸上画一个三维坐标,在第一卦限画一个房子,并任意墙上找出几个点作为插座,编上坐标计算最短连线,有简单到复杂,计算结果同程序运行结果对照,结果一样。 具体数据:
墙长宽高各为5,3个插座
A(1 2 0 2)B(2 2 0 4)C(3 2 5 1)
计算得AB间为6,结果正确;AC间为8,结果正确;ABC间为14,结果正确; 五:分析与探讨
经测试,结果正确,并让同队成员来测试,测试结果也正确。
待改进地方(1)没有考虑地板上有插座(2)没有考虑门的影响
解决方案:(1)定义插座参数m为5时表示插座在地板上,地板和每面墙为临面,则插座在地板上时的计算方法归结到第一种if条件中即可
(2)考虑门时可将门固定在一面墙上,比如1号墙(xz面),则所有连线中经过1号墙的
连线多一条判断语句,即判断连线在门上面过连线短还是在门下面过连线短,即可解决。
华 北 科 技 学 院
课程设计说明书
(数据结构课程设计)
班级: 信管B08-1 姓名: 陈秋苗
学号: 200807034118
设计题目: 敢死队问题
设计时间:__20##-9-6_____至___20##-9-17____
指导教师:______兰 芸__________________
评 语:________________________________
_________________________________________
_________________________________________
_________________________________________
_________________________________________
评阅成绩:__ __评阅教师:__ ___
《数据结构》课程设计实验报告
开课实验室:基础实验室一 20## 年9 月16 日
课程设计说明书课程名称:数据结构与算法专业:计算机科学与技术班级:103013姓名:XXX学号:03指导教师:XXX完成日期:20…
西安郵電學院数据结构课程设计报告题目校园导航系统院系名称计算机学院专业名称计算机科学与技术班级学生姓名学号8位指导教师设计起止时间…
安徽省巢湖学院计算机与信息工程学院课程设计报告课程名称课题名称用三元组实现稀疏矩阵的转置相加相乘专业计算机科学与技术班级学号AA姓…
扬州大学信息工程学院数据结构课程设计报告题目井字棋小游戏班级学号姓名指导教师一课程题目井字棋小游戏二需求分析计算机和人对弈问题计算…
攀枝花学院学生课程设计论文题目学生姓名学号20xx108010所在院系数学与计算机学院专业计算机科学与技术专业班级20xx级计算机…
CENTRALSOUTHUNIVERSITY数据结构课程设计报告题目学生姓名指导教师学院专业班级完成时间交通旅游图的最短路径问题摘…
课程设计说明书课程名:《数据结构课程设计》题目:一元多项式运算系统20##年1月一、课程认识数据结构课程主要是研究非数值计算的程序…
西安郵電學院数据结构课程设计报告题目校园导航系统院系名称计算机学院专业名称计算机科学与技术班级学生姓名学号8位指导教师设计起止时间…
攀枝花学院学生课程设计论文题目学生姓名学号20xx108010所在院系数学与计算机学院专业计算机科学与技术专业班级20xx级计算机…
数据结构课程设计报告学生姓名学号班级地信10901长江大学20XX.6目录1.需求分析......................…
程序设计心得体会做了一个星期的程序设计终于做完了,在这次程序设计课中,真是让我获益匪浅,我突然发现写程序还挺有意思的。由于上学期的…