数据结构拯救007Word格式.docx
- 文档编号:20670666
- 上传时间:2023-01-25
- 格式:DOCX
- 页数:13
- 大小:29.53KB
数据结构拯救007Word格式.docx
《数据结构拯救007Word格式.docx》由会员分享,可在线阅读,更多相关《数据结构拯救007Word格式.docx(13页珍藏版)》请在冰豆网上搜索。
程序结果输出到文件中。
对于每组输入数据,如果007可以逃脱,则输出007必须跳的最小的步数,然后按照跳出顺序记录跳出路径上的鳄鱼坐标;
如果007不能逃脱,则输出-1到文件。
算法的实现:
程序的实现少不了必要的头文件,在这里我加入了一个以前从没用过的不是标准库里面的头文件。
#include<
iostream.h>
conio.h>
#include<
stdlib.h>
stdio.h>
#defineISLAND_DIAMETER15/*小岛的直径*/
#defineLAKE_BOUNDARY_X50/*小岛到湖边的距离,在x轴上*/
#defineLAKE_BOUNDARY_Y50/*小岛到湖边的距离,在y轴上*/
#defineINFINITY10000/*可以跳的步数的最大值*/航班信息
拯救007源程序:
#defineINFINITY10000/*可以跳的步数的最大值*/
typedefunsignedintVertex;
typedefdoubleDistance;
typedefstructGraphNodeRecord{
intX;
/*x轴坐标*/
intY;
/*y轴坐标*/
unsignedintStep;
/*跳至该点的步数*/
VertexPath;
/*记录上一个点*/
}GraphNode;
typedefGraphNode*Graph;
GraphGraphNew(intNodeNum);
voidGraphDelete(GraphG);
/*判断007是否能从起始处跳至该点(x,y)*/
intCheckForStart(intx,inty,Distanced);
/*判断007是否能从该点跳至河岸*/
intCheckForEnd(intx,inty,Distanced);
/*判断007是否能从点i跳至点j*/
intCheckForConnect(Graphg,Vertexi,Vertexj,Distanced);
typedefunsignedintElemType;
/*在本程序中ElemType指定为int*/
/*链表形式*/
typedefstructNodeRecord{
ElemTypeElement;
structNodeRecord*Next;
/*指向下一个node*/
}*Node;
typedefstructDequeRecord{
NodeFront,Rear;
/*分别指向Deque的前后两个点*/
}*Deque;
DequeDequeNew();
voidDequeDelete(DequeD);
voidDequeClear(DequeD);
intIsEmpty(DequeD);
voidPush(ElemTypeX,DequeD);
ElemTypePop(DequeD);
voidInject(ElemTypeX,DequeD);
#defineCHECK(X)if(NULL==(X))Error("
Outofspace!
!
"
)
voidError(constchar*msg);
voidWarning(constchar*msg);
/******创建新的Graph******/
GraphGraphNew(intNodeNum)
{
GraphG;
inti;
if(NodeNum<
=0)returnNULL;
G=(GraphNodeRecord*)malloc(NodeNum*sizeof(GraphNode));
/*分配空间*/
CHECK(G);
for(i=0;
i<
NodeNum;
i++)/*初始化*/
G[i].X=0;
G[i].Y=0;
G[i].Step=INFINITY;
G[i].Path=0;
}
returnG;
/******删除一个Graph)******/
voidGraphDelete(GraphG)
if(G)free(G);
/*******判断007是否能从起始处跳至该点(x,y),步长是d******/
intCheckForStart(intx,inty,Distanced)
doublet;
t=(ISLAND_DIAMETER+(d*2.0));
return(x*x+y*y)<
=t*t/4.0;
/*x^2+y^2<
=(ISLAND_DIAMETER/2.0+d)^2*/
/*******判断007是否能从该点跳至河岸,步长是d******/
intCheckForEnd(intx,inty,Distanced)
if(x<
0)x=-x;
/*取x的绝对值*/
if(y<
0)y=-y;
/*取y的绝对值*/
return(d>
=LAKE_BOUNDARY_X-x)/*由于湖是个正方形,只需检查这两个距离*/
||(d>
=LAKE_BOUNDARY_Y-y);
/*******判断007是否能从点i跳至点j,步长是d******/
intCheckForConnect(Graphg,Vertexi,Vertexj,Distanced)
intx,y;
x=g[i].X-g[j].X;
y=g[i].Y-g[j].Y;
returnx*x+y*y<
=d*d;
/******创建新的Deque******/
DequeDequeNew()
DequeD;
D=(DequeRecord*)malloc(sizeof(structDequeRecord));
CHECK(D);
D->
Front=D->
Rear=(NodeRecord*)malloc(sizeof(structNodeRecord));
/*空的头*/
CHECK(D->
Front);
Front->
Element=0;
/*初始化*/
Rear->
Next=NULL;
returnD;
/******删除Deque******/
voidDequeDelete(DequeD)
if(D)
while(D->
Front)
Rear=D->
Next;
free(D->
Rear;
free(D);
/******DequeClear删除所有的节点除了头节点******/
voidDequeClear(DequeD)
Next)/*删除第一个节点*/
Next->
Next);
Next=D->
Front;
/******判断Deque是否为空******/
intIsEmpty(DequeD)
returnD->
Front==D->
/******将X元素压占到D中******/
voidPush(ElemTypeX,DequeD)
{
NodeNewNode;
NewNode=(NodeRecord*)malloc(sizeof(structNodeRecord));
/*建立新的节点*/
CHECK(NewNode);
NewNode->
Element=X;
if(D->
Rear)/*如果D为空*/
Rear=NewNode;
Next=NewNode;
/*压栈*/
/******将第一个元素出栈******/
ElemTypePop(DequeD)
NodeTemp;
ElemTypeItem;
Rear)
Error("
Dequeisempty"
);
return0;
else
Temp=D->
/*得到第一个元素*/
Next=Temp->
/*重置第一个元素*/
if(Temp==D->
Rear)/*如果只有一个元素*/
/*将D置空*/
Item=Temp->
Element;
free(Temp);
returnItem;
}
/******插入元素X至D末尾******/
voidInject(ElemTypeX,DequeD)
/*创建新节点*/
/******打印错误信息,并退出程序******/
voidError(constchar*msg)
if(NULL!
=msg)
fprintf(stderr,"
%s\n"
msg);
exit(-1);
/******打印警告信息,但并不退出程序******/
voidWarning(constchar*msg)
;
/******读入一个case返回一个Graph,*Bank记录最短到达河岸的路径******/
Graphread_case(FILE*InFile,intnum,Vertex*Bank,DequeD)
GraphG=NULL;
DistanceJamesJump;
VertexV;
inti,Times;
*Bank=0;
fscanf(InFile,"
%lf"
&
JamesJump);
if(CheckForEnd(0,0,JamesJump+ISLAND_DIAMETER/2.0))
(num<
<
1);
i++)/*一步便跳出的情况*/
%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;
Times;
i++)/*不必检验其他鳄鱼*/
DequeClear(D);
break;
else
Inject(i,D);
/*插入该点,并开始下一个检测*/
while(!
IsEmpty(D))/*只经过一个鳄鱼无法跳出,必须还要跳到其它鳄鱼的情况*/
V=Pop(D);
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))
/******写出结果,即最短路径******/
voidwrite_result(FILE*OutFile,VertexBank,GraphG,DequeD)
unsignedintTimes,i;
switch(Bank){
case0:
/*007无法跳出*/
fprintf(OutFile,"
%d\n"
-1);
case1:
/*007可以直接跳出*/
1);
default:
Times=G[Bank].Step+1;
/*跳的步数*/
while(Bank!
=1)/*跟踪路径*/
Push(Bank,D);
Bank=G[Bank].Path;
Times);
/*输出*/
for(i=1;
i++)
%d"
G[V].X);
G[V].Y);
intmain(intargc,char*argv[])
FILE*in,*out;
intVertexNum;
VertexBank=0;
in=fopen("
input.txt"
"
r"
if(NULL==in)
fprintf(stderr,"
Cannotopeninput.txt"
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(out);
DequeDelete(D);
实训总结、体会:
经过这次的课程设计,我很深刻的意识到自己的编程能力还有待提高,发现自己还存在很多不会的问题,有些细节问题没有注意到,还得学会冷静思考,加强算法和C语言语法的学习。
其中对英语的要求也体现出来了,因为它说明错误的时候都是英语,遇到问题要及时去查相关的资料。
反复的调试程序,最好是多找几个同学来对你的程序进行调试并听他说对你的程序的建议。
要形成自己的编写程序与调试程序的风格,从每个细节出发,不放过每个知识点,注意与理论的联系和理论与实践的差别。
另外,得注意符号的使用,注意对字符的处理,特别是对指针的使用时很容易出错且调试过程不会报错,但最后的结果却不是你想要的。
程序在完成之后,当时你调试运行时没有错误,可能错误就恰好隐藏在你没有检查的地方,要更全面的检查,特别是几个选择合起来一起挨个执行一遍。
通过进一周的学习实训和课程设计,又一次体验了离开课堂的理论学习,做了一次真正实践与理论相结合的连接。
特别是所做的题目基本都不是课堂上所讲的例子,但却是每一步都是用到课堂的内容。
实训让我对懂得的知识做了进一步深入了解,让我对其的理解与记忆更深刻,对不懂的知识与不清楚的东西也做了一定的了解,也形成了一定的个人编程风格。
在这次的课程设计中,学到了许多新的知识,比如还知道了除了标准库外其他函数的用法,知道程序的框架对于写一个完整的程序来说是很重要的,写出了大体框架就等于完成了一半程序,但不管怎么样,继续努力也是必不可少的。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 拯救 007