数据结构课程设计报告 最短路径拯救007.docx
- 文档编号:6681424
- 上传时间:2023-01-08
- 格式:DOCX
- 页数:23
- 大小:465.61KB
数据结构课程设计报告 最短路径拯救007.docx
《数据结构课程设计报告 最短路径拯救007.docx》由会员分享,可在线阅读,更多相关《数据结构课程设计报告 最短路径拯救007.docx(23页珍藏版)》请在冰豆网上搜索。
数据结构课程设计报告最短路径拯救007
数据结构课程设计报告
最短路径:
拯救007
专业
物联网工程
学生姓名
班级
学号
指导教师
完成日期
2016年1月13日
目录
1、课程设计目的及要求1
2、课题总体设计2
3、详细设计4
4、图像文件5
5、调试与测试6
6、小结8
7、参考文献9
8、源程序清单10
数据结构程序课程的设计
1、课程设计目的及要求
1)设计题目
看过007系列电影的人们一定很熟悉JamesBond这个世界上最著名的特工了。
在电影“LiveandLetDie”中JamesBond被一组毒品贩子抓住并且关到湖中心的一个小岛上,而湖中有很多凶猛的鳄鱼。
这时JamesBond做出了最惊心动魄的事情来逃脱——他跳到了最近的鳄鱼的头上,在鳄鱼还没有反应过来的时候,他又跳到了另一只鳄鱼的头上……最后他终于安全地跳到了湖岸上。
假设湖是100×100的正方形,设湖的中心在(0,0),湖的东北角的坐标是(50,50)。
湖中心的圆形小岛的圆心在(0,0),直径是15。
一些凶猛的鳄鱼分布在湖中不同的位置。
现已知湖中鳄鱼的位置(坐标)和JamesBond可以跳的最大距离,请你告诉JamesBond一条最短的到达湖边的路径。
他逃出去的路径的长度等于他跳的次数。
2)输入要求
程序从“input.txt”文件中读取输入信息,这个文件包含了多组输入数据。
每组输入数据的起始行中包含两个整数n和d,n是鳄鱼的数量而且n≤100,d是007可以跳的最大距离而且d>0。
起始行下面的每一行是鳄鱼的坐标(x,y),其中x,y都是整数,而且没有任何两只鳄鱼出现在同一个位置。
input.txt文件以一个负数结尾。
3)输出要求
程序输出结果输出到output.txt文件中。
对于每组输入数据,如果007可以逃脱,则输出到output.txt文件的内容格式如下:
第一行是007必须跳的最小的步数,然后下面按照跳出顺序记录跳出路径上的鳄鱼坐标(x,y),每行一个坐标。
如果007不可能跳出去,则将-1写入文件。
如果这里有很多个最短的路径,只需输出其中的任意一种
2、课题总体设计
2.1设计分析
1.明确题目中的已知条件
(1)007被关的小岛在湖的中心;
(2)小岛是圆形,圆心在(0,0),而且直径是15;
(3)没有两只鳄鱼在同一个位置;
(4)鳄鱼的坐标值都是整数。
2.一些判断007是否能跳出的细节
(1)判断007是否能够直接从岛上跳到湖岸:
由已知条件可得,湖是一个正方形,边长为100,中心是在(0,0),四个顶点分别是(50,50),(50,-50),(-50,-50),(-50,50)。
而湖中小岛的直径是15.所以如果007可以跳大于等于(50-15/2)=42.5,他就可以直接从小岛跳到湖岸,而不用经过鳄鱼。
(2)判断007是否能够直接从岛上跳到湖中点A:
已知半径是7.5,假设点A的坐标是(x,y),007的步长是L,则当点A到中心(0,0)的距离小于等于007的步长加上小岛的半径7.5的时候就能确定007可以从岛上跳到点A,即:
x*x+y*y<=(L+7.5)*(L+7.5)。
(3)判断007是否能够从点A跳到点B:
假设007的步长是L所以如果两点之间的距离小于等于L,则判断007可以从A跳到B,即(A.x-B.x)^2+(A.y-B.y)^2<=L*L;其他情况时007不能从A点跳到B点。
(4)判断007是否能够从点A跳到湖岸:
当从A点到湖岸的距离小于等于007的步长的时候,说明他可以从A点跳到湖岸,|A.x|+L>=50或|A.y|+L>=50;其他情况时007不能从A点跳到湖岸。
2.2系统流程图
开始
初始化路径
Y
能否直接跳出?
N
跳出
N
有无鳄鱼?
Y
N
能否从岛上跳上该点?
Y
记录该点
能否跳出该点?
N
Y
记录该点
插入该点,检测下一点
结束
N
Y
判断能否跳出,并比其他短
3、详细设计
主要数据结构与算法:
为了记录007跳过的路径,可定义为如下结构:
typedefunsignedintVertez;
typedefdoubleDistance;
typedefstructGraphNodeRecord{
intX;/*x轴坐标*/
intY;/*y轴坐标*/
unsignedintStep;/*记录到本节点一共跳了多少步*/
VertexPath;/*指向本节点的父节点,即跳到本节点之间007所在节点*/
}GraphNode;
typedefGraphNode*Grapha;
寻找跳出路径的算法:
/*读出一组测试数据返回007跳过的路径Graph,*Bank记录最短到达湖岸的路径。
该算法实际上是应用队列对图惊醒广度搜索,以寻找到岸边的最短路径,其中入队列与出队列函数分别是Inject()和Pop()*/
Graphread_case(FILE*InFile,intnum,Vertex*Bank,DequeD)
{
GraphG=NULL;
DistanceJamesJump;
VertexV;
intx,y;
inti,Times;
*Bank=0;/*初始化跳出的路径的记录*/
fscanf(Infile,”%lf”,&JamesJump);/*读取步长*/
if(Bondcanjumotothebankdirectly)
{
*Bank=1;/*直接跳出的情况*/
}
elseif(num>0)/*007必须经过鳄鱼头上的情况*/
{
num+=2;
G=GraphNew”(num);
for(i=2;i { if(BondcanjumptoG[i]fromisland)/*判断是否能从岛上跳上该点*/ { G[i].Path=1; G[i].Step=1;/*一步*/ if(BondcanjumptobankfromG[i])/*判断该点是否能跳出*/ { *Bank=i;/*007可以跳出,记录该点*/ Skipothercrocodile break; } else Inject(i,D);/*插入该点,并开始下一个检测*/ } } while(! IsEmpty(D))/*只经过一只鳄鱼无法跳出,必须还要跳到其他鳄鱼的情况*/ { V=Pop(D); for(i=2;i { if(bondcanjumpfromvtoi,andstepofi>stepofv+1) { G[i].Path=V; G[i].Step=G[V].Step+1;/*把i点练到v点后面*/ if(bondcanjumpfromitobankandthepathisshorterthanothers) *Bank=i; else Inject(i,D); } } } } returnG; } 在执行完算法read_case后,*Bank值可能如下3种可能: (1)0,意味着007无法逃脱出去; (2)1,意味着007可以直接从岛上跳出去,而不用经过鳄鱼的脑袋; (3)k,返回的第k点是007经过最短路径逃出鳄鱼潭是经过的最后一个顶点。 可以根据G[k]的path参数来追踪该点的上一点,由此类推可以得到007逃脱的最短路径。 4、图像文件 5、调试与测试 5.1)调试 打开工程文件,如图1所示: (图一.打开工程) 运行,出现如图2所示: (图二.运行) 5.2)测试方法: •007步长很大,以至于可以直接跳出,例如: 43 1 •007不可能逃出去的情况(根本就没有鳄鱼),例如: 1 1 •一般情况的例子,例如: 410 170 270 370 450 10 2030 1 •最短路径有多条,只需要输出任意一种即可,例如: 2510 88 99 1010 1111 1212 1313 1414 1515 1616 1818 2020 2323 2525 2727 2828 2929 3131 3333 3535 3838 4141 4444 4646 4747 4949 输出结果: 7 99 1616 2323 2828 3535 4141 •input.txt文件中,名称不正确、空文件、缺少部分输入等不规范情况,例如: 510 1010 -2530 3030 注: 缺少鳄鱼点(应有5个鳄鱼点)和文件结尾符(-1)。 下面给出一个较复杂的测试用例和期望输出结果。 6510 810 98 1110 1114 1212 1613 1815 1418 1522 1515 1623 1630 1818 1835 2020 2323 2537 2727 2840 2922 3131 (转右行) 3333 3518 4015 3838 4141 2448 4444 4646 4747 4949 -49-19 -40-18 -44-10 -39-5 -380 -325 -320 -2811 -257 -180 -17-2 -193 (转右行) -120 -10-10 -13-13 18-25 20-48 11-22 -2918 -4040 -40-40 40-40 49-49 35-37 27-30 22-22 14-22 8-10 10-18 -2329 -2020 -2123 -1819 -1015 -10 期望输出结果: 7 810 1613 2020 2727 3131 2840 5.3)测试: 在input输入测试数据,如图3所示: (图3输入测试数据) 5.4)测试的结果: 在output查看测试结果,如图4所示: (图4测试结果) 6、小结 经过这次的课程设计,我很深刻的意识到自己的编程能力还有待提高,发现自己还存在很多不会的问题,有些细节问题没有注意到,还得学会冷静思考,加强算法和C语言语法的学习。 其中对英语的要求也体现出来了,因为它说明错误的时候都是英语,遇到问题要及时去查相关的资料。 反复的调试程序,最好是多找几个同学来对你的程序进行调试并听他说对你的程序的建议。 要形成自己的编写程序与调试程序的风格,从每个细节出发,不放过每个知识点,注意与理论的联系和理论与实践的差别。 另外,得注意符号的使用,注意对字符的处理,特别是对指针的使用时很容易出错且调试过程不会报错,但最后的结果却不是你想要的。 程序在完成之后,当时你调试运行时没有错误,可能错误就恰好隐藏在你没有检查的地方,要更全面的检查,特别是几个选择合起来一起挨个执行一遍。 通过进一周的学习实训和课程设计,又一次体验了离开课堂的理论学习,做了一次真正实践与理论相结合的连接。 特别是所做的题目基本都不是课堂上所讲的例子,但却是每一步都是用到课堂的内容。 实训让我对懂得的知识做了进一步深入了解,让我对其的理解与记忆更深刻,对不懂的知识与不清楚的东西也做了一定的了解,也形成了一定的个人编程风格。 在这次的课程设计中,学到了许多新的知识,比如还知道了除了标准库外其他函数的用法,知道程序的框架对于写一个完整的程序来说是很重要的,写出了大体框架就等于完成了一半程序,但不管怎么样,继续努力也是必不可少的。 7、参考文献 【1】《数据结构课程设计》何钦铭冯雁陈越著浙江大学出版社2015-2 【2】《数据结构(C语言版)》严蔚敏吴伟民著清华大学出版社2011-11 8、源程序清单 #include"Graph.h" #include"Deque.h" #include"error.h" #include #include /******读入一个case返回一个Graph,*Bank记录最短到达河岸的路径******/ Graphread_case(FILE*InFile,intnum,Vertex*Bank,DequeD) { GraphG=NULL; DistanceJamesJump; VertexV; intx,y; inti,Times; *Bank=0; fscanf(InFile,"%lf",&JamesJump); if(CheckForEnd(0,0,JamesJump+ISLAND_DIAMETER/2.0)) { for(i=0;i<(num<<1);i++)/*一步便跳出的情况*/ fscanf(InFile,"%d",&x); *Bank=1; } elseif(num>0)/*007必须经过鳄鱼头上的情况*/ { num+=2; G=GraphNew(num); for(i=2;i { fscanf(InFile,"%d",&x); fscanf(InFile,"%d",&y); G[i].X=x; G[i].Y=y; if(CheckForStart(x,y,JamesJump))/*判断是否能跳上该点*/ { G[i].Path=1;/*007可以跳到*/ G[i].Step=1;/*一步*/ if(CheckForEnd(x,y,JamesJump))/*判断该点是否能跳出*/ { *Bank=i;/*007可以跳出*/ Times=(num-i-1)<<1; for(i=0;i fscanf(InFile,"%d",&y); DequeClear(D); break; } else Inject(i,D);/*插入该点,并开始下一个检测*/ } } while(! IsEmpty(D))/*只经过一个鳄鱼无法跳出,必须还要跳到其它鳄鱼的情况*/ { V=Pop(D); for(i=2;i { if((G[i].Step>G[V].Step+1) &&CheckForConnect(G,V,i,JamesJump)) { G[i].Path=V; G[i].Step=G[V].Step+1; if((G[i].Step &&CheckForEnd(G[i].X,G[i].Y,JamesJump)) *Bank=i; else Inject(i,D); } } } } returnG; } /******写出结果,即最短路径******/ voidwrite_result(FILE*OutFile,VertexBank,GraphG,DequeD) { unsignedintTimes,i; VertexV; switch(Bank){ case0: /*007无法跳出*/ fprintf(OutFile,"%d\n",-1); break; case1: /*007可以直接跳出*/ fprintf(OutFile,"%d\n",1); break; default: Times=G[Bank].Step+1;/*跳的步数*/ while(Bank! =1)/*跟踪路径*/ { Push(Bank,D); Bank=G[Bank].Path; } fprintf(OutFile,"%d\n",Times);/*输出*/ for(i=1;i { V=Pop(D); fprintf(OutFile,"%d",G[V].X); fprintf(OutFile,"%d\n",G[V].Y); } } } intmain(intargc,char*argv[]) { FILE*in,*out; DequeD; intVertexNum; GraphG=NULL; VertexBank=0; in=fopen("input.txt","r"); if(NULL==in) { fprintf(stderr,"Cannotopeninput.txt"); exit(-1); } out=fopen("output.txt","w"); if(NULL==out) { fprintf(stderr,"Cannotopenoutput.txt"); fclose(in); exit(-1); } D=DequeNew(); while((EOF! =fscanf(in,"%d",&VertexNum))&&(0<=VertexNum)) { G=read_case(in,VertexNum,&Bank,D);/*读文件直到结尾*/ write_result(out,Bank,G,D); if(G) GraphDelete(G); } fclose(in); fclose(out); DequeDelete(D); return0; }
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构课程设计报告 最短路径拯救007 数据结构 课程设计 报告 路径 拯救 007