数据结构课程设计报告 最短路径拯救007Word文档下载推荐.docx
《数据结构课程设计报告 最短路径拯救007Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《数据结构课程设计报告 最短路径拯救007Word文档下载推荐.docx(23页珍藏版)》请在冰豆网上搜索。
如果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
跳出
有无鳄鱼?
能否从岛上跳上该点?
记录该点
能否跳出该点?
插入该点,检测下一点
结束
判断能否跳出,并比其他短
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<
num;
i++)/*第3个node开始是鳄鱼*/
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;
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不可能逃出去的情况(根本就没有鳄鱼),例如:
•一般情况的例子,例如:
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
•input.txt文件中,名称不正确、空文件、缺少部分输入等不规范情况,例如:
510
-2530
3030
注:
缺少鳄鱼点(应有5个鳄鱼点)和文件结尾符(-1)。
下面给出一个较复杂的测试用例和期望输出结果。
6510
810
98
1110
1114
1613
1815
1418
1522
1623
1630
1835
2323
2537
2840
2922
(转右行)
3518
4015
2448
-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
期望输出结果:
5.3)测试:
在input输入测试数据,如图3所示:
(图3输入测试数据)
5.4)测试的结果:
在output查看测试结果,如图4所示:
(图4测试结果)
6、小结
经过这次的课程设计,我很深刻的意识到自己的编程能力还有待提高,发现自己还存在很多不会的问题,有些细节问题没有注意到,还得学会冷静思考,加强算法和C语言语法的学习。
其中对英语的要求也体现出来了,因为它说明错误的时候都是英语,遇到问题要及时去查相关的资料。
反复的调试程序,最好是多找几个同学来对你的程序进行调试并听他说对你的程序的建议。
要形成自己的编写程序与调试程序的风格,从每个细节出发,不放过每个知识点,注意与理论的联系和理论与实践的差别。
另外,得注意符号的使用,注意对字符的处理,特别是对指针的使用时很容易出错且调试过程不会报错,但最后的结果却不是你想要的。
程序在完成之后,当时你调试运行时没有错误,可能错误就恰好隐藏在你没有检查的地方,要更全面的检查,特别是几个选择合起来一起挨个执行一遍。
通过进一周的学习实训和课程设计,又一次体验了离开课堂的理论学习,做了一次真正实践与理论相结合的连接。
特别是所做的题目基本都不是课堂上所讲的例子,但却是每一步都是用到课堂的内容。
实训让我对懂得的知识做了进一步深入了解,让我对其的理解与记忆更深刻,对不懂的知识与不清楚的东西也做了一定的了解,也形成了一定的个人编程风格。
在这次的课程设计中,学到了许多新的知识,比如还知道了除了标准库外其他函数的用法,知道程序的框架对于写一个完整的程序来说是很重要的,写出了大体框架就等于完成了一半程序,但不管怎么样,继续努力也是必不可少的。
7、参考文献
【1】《数据结构课程设计》何钦铭冯雁陈越著浙江大学出版社2015-2
【2】《数据结构(C语言版)》严蔚敏吴伟民著清华大学出版社2011-11
8、源程序清单
#include"
Graph.h"
Deque.h"
error.h"
#include<
stdlib.h>
stdio.h>
/******读入一个case返回一个Graph,*Bank记录最短到达河岸的路径******/
Graphread_case(FILE*InFile,intnum,Vertex*Bank,DequeD)
GraphG=NULL;
intx,y;
inti,Times;
fscanf(InFile,"
%lf"
&
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;
num;
i++)/*第三个node开始是鳄鱼*/
{
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;
Times;
i++)/*不必检验其他鳄鱼*/
fscanf(InFile,"
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<
G[*Bank].Step)
&
CheckForEnd(G[i].X,G[i].Y,JamesJump))
*Bank=i;
else
Inject(i,D);
/******写出结果,即最短路径******/
voidwrite_result(FILE*OutFile,VertexBank,GraphG,DequeD)
unsignedintTimes,i;
switch(Bank){
case0:
/*007无法跳出*/
fprintf(OutFile,"
%d\n"
-1);
break;
case1:
/*007可以直接跳出*/
1);
default:
Times=G[Bank].Step+1;
/*跳的步数*/
while(Bank!
=1)/*跟踪路径*/
Push(Bank,D);
Bank=G[Bank].Path;
Times);
/*输出*/
for(i=1;
i++)
fprintf(OutFile,"
%d"
G[V].X);
G[V].Y);
}
intmain(intargc,char*argv[])
FILE*in,*out;
DequeD;
intVertexNum;
VertexBank=0;
in=fopen("
input.txt"
"
r"
);
if(NULL==in)
{
fprintf(stderr,"
Cannotopeninput.txt"
exit(-1);
out=fopen("
output.txt"
w"
if(NULL==out)
Cannotopenoutput.txt"
fclose(in);
D=DequeNew();
while((EOF!
=fscanf(in,"
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;