1、Elemtype; typedef struct /队列的类型定义 Elemtype elemMAXSIZE; int front,rear; int len;SqQueue;3.2模块设计定义函数DLmazepath( ),利用队列实现迷宫求。定义函数DLmazepath( ),实现队列的迷宫路径输出。定义函数InitQueue(),实现队列的初始化。定义函数QueueEmpty( ),判断队列是否为空,为空返回1,否则返回0.定义函数GetHead (SqQueue q,Elemtype *e),实现队头元素的读取。定义函数EnQueue(SqQueue *q,Elemtype e),实现
2、入队操作。定义函数DeQueue(SqQueue *q,Elemtype *e),实现出队操作。定义函数Sprint(int aM+2N+2),实现,迷宫的输出。4 详细设计(1)主函数void main() int a,i,j,maze2M+2N+2;/*构造一个迷宫*/ int mazeM+2N+2= 1,1,1,1,1,1,1,1,1,1, 1,0,1,1,1,0,1,1,1,1, 1,1,0,1,0,1,1,1,1,1, 1,0,1,0,0,0,0,0,1,1, 1,1,0,0,1,1,0,0,0,1, 1,0,1,1,0,0,1,1,0,1, 1,1,1,1,1,1,1,1,1,1;
3、 item move8=0,1,1,1,1,0,1,-1,0,-1,-1,-1,-1,0,-1,1; /*坐标增量数组move的初始化*/为使得程序更加人性化,更加友好,因此可将系统输出界面设置如下: printf( |*迷宫求解系统*|n); printf( | 1 、栈方法 求解迷宫的路径 |n | 2 、队列 求解的迷宫路径 |n | 3、 退出系统 |n |*|ntnn请选择(0-3): scanf(%d,&a); while(a!=3) switch(a) Case 1:Sprint(maze);printf(“路径为:n Zmazepath(maze,move);break; Ca
4、se2:Sprint(maze2);printf(路径: DLmazepath(maze2,move); default :tt选择错误! tn请选择(0-3).n ntt非常感谢您的使用!(2)利用队列实现迷宫求解伪代码如下:int DLmazepath_(int mazeM+2N+2,item move8)/*采用队列的迷宫算法。MazeM+2N+2表示迷宫数组,move8表示坐标增量数组*/ 队的初始化; 将入口点坐标及到达该点的方向(设为-1)入队; While(队不为空) For( 从1到8个方向) 求新坐标点坐标,并将可到达点分别入队; If(点(x,y)为出口点)结束输出路径,迷
5、宫有路; 当前点搜索完8个方向后出队; Return o /*迷宫五路*/void DLprintpath(SqQueue q)/输出迷宫路径,队列中保存的就是一条迷宫的通路 int i; i=q.rear-1; do printf(%d,%d)-,(q.elemi).x,(q.elemi).y); i=(q.elemi).pre;while(i!=-1)利用栈方法和队列方法用到的是同一个迷宫数组,在使用栈方法实现迷宫求解时,为避免死循环改变了原来的迷宫数组的个别路径值,因此使用队列求解时不能得到相应的路径解,为避免此,我们可在用栈方法求解迷宫路径之前将数组赋值给另一个数组,这样队列求解迷宫时
6、可以再原来不改变的迷宫数组下进行。具体实现代码如下: for(i=0;iM+2;i+) for(j=0;jN+2;j+) maze2ij=mazeij;(3)队列的操作void InitQueue(SqQueue *q) /*队列的初始化*/ 将队中元素赋值为0;int QueueEmpty(SqQueue q) /*判队空*/ if(队长度为0) 返回 1; else 返回 0;void GetHead (SqQueue q,ElemType *e)/*读队头元素*/ if(队的长度为0) 输出提示队列为空; else 将队中值赋给e; void EnQueue(SqQueue *q,Ele
7、mType e)/*入队*/ if(队列长度已满)输出提示; else 将e中元素赋给队列; 队尾指针指向下一个元素;队长加1;void DeQueue(SqQueue *q,ElemType *e)/*出队*/ if(判队空) 输出提示; else 将队中元素赋给e;队头指向下一个元素;队长减1; 5 测试分析测试数据及结果如下:(1)系统友好界面输出 图5.1 进入系统界面运行结果(2)选择1,运行结果输出如下: 图5.2 迷宫以及使用栈求解迷宫路径的输出(3)选择2、3 运行结果如下: 图5.3 迷宫以及使用队列求解迷宫路径的输出(4)选择3运行结果如下: 图5.3 退出程序 根据结果分
8、析:利用栈求得的路径不一定是最短路径,而用队列求得的路径是最短路径。6 课程设计总结课程设计终于在本组组员共同的努力下完成了。通过本次课程设计让我对栈和队列这一章的知识有了进一步了解,也让我知道了用栈和队列实现迷宫问题的基本原理,知道了栈和队列的不同存储结构的定义和算法描述,同时也学会了编写简单的迷宫问题的程序。选了题目之后,我感觉题目之前已经做过一点相关的实验,本以为很快就能搞好,但是,真正做起来才感觉没有那么简单,让我更加意识到自己的不足,我所知道的,所懂的太少了。在刚开始编程的时候,我感到有点迷茫,虽然懂得了其相应的算法和思想,但是却不知道要怎样安排程序的结构、以及什么方法将其功能实现,
9、更不知道要从哪里开始着手进行。老师说的没错,我们平时的学习中程序练习太少,写的太少,什么事不可能一蹴而就,都是通过一点一滴的锻炼慢慢积累起来的。所以我觉得在以后的学习中,我会更加注重实践,注重多练,多积累,为自己的以后工作打下结实的基础。参考文献1 黄同成,黄俊民,董建寅数据结构M北京:中国电力出版社,20082 董建寅,黄俊民,黄同成数据结构实验指导与题解M北京:3 严蔚敏,吴伟民. 数据结构(C语言版)M. 北京:清华大学出版社,20024 刘振鹏,张晓莉,郝杰数据结构M北京:中国铁道出版社,2003致 谢在这次课程设计的撰写过程中,我得到了许多人的鼓励和帮助,在此,我表示衷心的感谢。首先
10、,我要感谢我的指导老师黄同城老师,他在课程设计上给予我的很大的帮助,指导课程设计的具体实现方向。并且为我分析部分比较难懂的地方,让我把此次课程设计做得更加完善。在此期间,我对迷宫问题有了更深刻的认识,而且也明白了很多做课程设计需要注意的地方,让我变得更严谨。然后,我要感谢我们第一大组组员们,在组内讨论时,他们各抒己见,思路发散,讨论时锱铢必较,正是因为这份热情,我们对这次的课程设计充满了激情,方向也很明确。在汇报进程的时候,组内积极讨论,相互竞争,优缺互补,让我们的课程设计更加完美,让我们自己在讨论中知道自己的优点,认识自己的缺点,不断完善自己。最后感谢我的母校邵阳学院,谢谢母校为我们提供了这
11、样一个环境,让同学们能相聚在一起,让我们有这样一起奋斗共同完成目标的经历。附录 具体程序代码实现#includestdlib.h#define M 6#define N 8#define MAXSIZE 100#define MAX M*Ntypedef struct /栈的相关类型定义 int x,y,d; /d 下一步方向 elemtype;typedef struct elemtype dataMAXSIZE; int top; Sqstack; int x,y; item; Elemtype;typedef struct /队列的类型定义 Elemtype elemMAXSIZE; S
12、qQueue;/* 栈函数 */void InitStack(Sqstack *s) /构造空栈 s-top=-1; int Stackempty(Sqstack s) /判断栈是否为空 if(s.top=-1) return 1; return 0;void push(Sqstack *s,elemtype e) /入栈 if(s-top=MAXSIZE-1) printf(Stack is fulln return;top+;datas-top.x=e.x;top.y=e.y;top.d=e.d;void pop (Sqstack *s,elemtype *e) / 出栈算法 top=-1
13、)Stack is emptyn e-x=s-top.x;y=s-top.y;d=s-top.d;top-;/* 队函数 */void InitQueue(SqQueue *q) /队的初始化 q-front=q-rear=0;len=0;int QueueEmpty(SqQueue q) /判断队空 if (q.len=0) else return 0;void GetHead (SqQueue q,Elemtype *e)/读队头元素Queue is emptyn else *e=q.elemq.front;void EnQueue(SqQueue *q,Elemtype e) /入队 i
14、f(q-len=MAXSIZE)Queue is fullnelemq-rear.x=e.x;q-rear.y=e.y;rear.pre=e.pre;rear=q-rear+1;len+;void DeQueue(SqQueue *q,Elemtype *e) /出队len=0)x=q-rear.x;e-y=q-rear.y;pre=q-rear.pre;front+1;len-;void Sprint(int aM+2N+2) int i,j;迷宫为:%2d,aij);void Zprintpath(Sqstack s)/输出迷宫路径,栈中保存的就是一条迷宫 的通路 elemtype tem
15、p;,M,N); while(!Stackempty(s) pop(&s,&temp);,temp.x,temp.y); printf(void Zmazepath(int mazeM+2N+2,item move8) /栈的迷宫求解输出 Sqstack s;int x,y,d,i,j; InitStack(&s);/栈的初始化 temp.x=1;temp.y=1;temp.d=-1; push(&s,temp);Stackempty (s) x=temp.x;y=temp.y;d=temp.d+1; while(d8) i=x+moved.x; j=y+moved.y; if(mazeij=
16、0) temp.x=x;temp.y=y;temp.d=d; x=i;y=j; mazexy=-1; if(x=M&y=N) Zprintpath(s); return; else d=0; /if else d+; /while /while迷宫无路nreturn; int i; do i=(q.elemi).pre; while(i!=-1);void DLmazepath(int maze1M+2N+2,item move8) /队列的迷宫求解 SqQueue q; Elemtype head,e; int x,y,v,i,j; InitQueue(&q); /队列的初始化 e.x=1;
17、e.y=1;e.pre=-1; EnQueue (&q,e); maze111=-1;QueueEmpty (q) GetHead(q,&head); x=head.x;y=head.y; for(v=0;v8;v+) i=x+movev.x; j=y+movev.y; if(maze1ij=0) e.x=i;e.y=j;e.pre=q.front; EnQueue(& maze1xy=-1; /if if(i=M&j=N) DLprintpath(q); return ; /for DeQueue(&q,&迷宫无路! int a,i,j,maze2M+2N+2; 1,1,1,1,1,1,1,
18、1,1,1, 1,0,1,1,1,0,1,1,1,1, 1,1,0,1,0,1,1,1,1,1, 1,0,1,0,0,0,0,0,1,1, 1,1,0,0,1,1,0,0,0,1, 1,0,1,1,0,0,1,1,0,1, 1,1,1,1,1,1,1,1,1,1;item move8=0,1,1,1,1,0,1,-1,0,-1,-1,-1,-1,0,-1,1; | |n | 1 、栈 求解迷宫的路径 |n | 2 、队列 求解的迷宫路径 |n | 3 、退出系统 |n |*|n tnn请选择(0-3): switch(a) case 1:求解路径为: case 2:tn请选择(0-3):ntt结束退出程序!
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1