数据结构课程设计报告迷宫算法.doc

上传人:文库蛋蛋多 文档编号:2396815 上传时间:2023-02-17 格式:DOC 页数:24 大小:489KB
返回 下载 相关 举报
数据结构课程设计报告迷宫算法.doc_第1页
第1页 / 共24页
数据结构课程设计报告迷宫算法.doc_第2页
第2页 / 共24页
数据结构课程设计报告迷宫算法.doc_第3页
第3页 / 共24页
数据结构课程设计报告迷宫算法.doc_第4页
第4页 / 共24页
数据结构课程设计报告迷宫算法.doc_第5页
第5页 / 共24页
点击查看更多>>
资源描述

《数据结构课程设计报告迷宫算法.doc》由会员分享,可在线阅读,更多相关《数据结构课程设计报告迷宫算法.doc(24页珍藏版)》请在三一办公上搜索。

1、 课 程 设 计 报 告课程设计名称:数据结构课程设计课程设计题目:迷宫算法 院(系):计算机学院专 业:计算机科学与技术班 级:04010103学 号:2010040101107 目 录1 课程设计介绍11.1 课程设计内容11.2 课程设计要求12 课程设计原理22.1 课设题目粗略分析22.2 原理图介绍32.2.1 功能模块图32.2.2 流程图分析33 数据结构分析93.1 存储结构93.2 算法描述94 调试与分析114.1 调试过程114.2程序执行过程11参考文献13附 录(关键部分程序清单)14 1 课程设计介绍1.1 课程设计内容编写算法能够生成迷宫,并且求解迷宫路径(求解

2、出任意一条到出口的路径即可):1. 迷宫用上下左右四种走法;2. 迷宫的大小和复杂程度可以由用户定义;3. 入口出口也由用户自己选择。1.2 课程设计要求1. 不必演示求解过程,只需要输出迷宫求解的路径;2. 参考相应资料完成课设。2 课程设计原理2.1 课设题目粗略分析根据课设题目要求,拟将整体程序分为四大模块。以下是四个模块的大体分析:1 建立迷宫:要建立迷宫首先就要建立存储结构,这里我用栈的方式建立的。根据用户输入的迷宫的大小(我设置的最大值为25可以根据要求调解);2 设置迷宫:这里将0设置围墙,1是可以通过的路径,-1是不可以通过路径,外墙是以设计好的,内墙需要用户来设置,障碍的难度

3、可由用户自行定义;3 寻找路径:寻找路径我设置了四个方向0,1,1,0,0,-1,-1,0移动方向,依次为东南西北,首先向东走,若不成功则转换方向,成功则继续前进,将走过的路径进行标记,然后存入栈中;4 输出结果:输出的结果分为两种,一种是用户建立的迷宫主要是让用户检查是否符合要求,第二种输出的是寻找完后的路径,路径用1 2 3 4来表示。2.2 原理图介绍2.2.1 功能模块图图2.1 功能模块图如图2.1所示 2.2.2 流程图分析 1. 建立迷宫图2.2建立迷宫函数流程图2. 设置迷宫图2.3 设置迷宫函数流程图3. 寻找路径 图2.4 寻找路径函数流程图4.输出结果图2.5 输出结果函

4、数流程图3 数据结构分析3.1 存储结构定义一个整型数组PosType用来存储行列的值。typedef struct / 栈的元素类型 int ord; / 通道块在路径上的序号 PosType seat; / 通道块在迷宫中的坐标位置 int di; / 从此通道块走向下一通道块的方向(03表示东北) SElemType; 栈的存储结构:#define STACK_INIT_SIZE 10/ 存储空间初始分配量 #define STACKINCREMENT 2/ 存储空间分配增量 / 栈的顺序存储表示 typedef struct SqStackSElemType *base;/ 在栈构造之

5、前和销毁之后,base的值为NULL SElemType *top;/ 栈顶指针 int stacksize;/ 当前已分配的存储空间,以元素为单位 SqStack;/ 顺序栈3.2 算法描述1.栈的基本操作的算法,简单算法说明如下:Status InitStack(SqStack *S)/构造一个空栈S,为栈底分配一个指定大小的存储空间(*S).base = (SElemType *)malloc(STACK_INIT_SIZE*sizeof(SElemType);if( !(*S).base ) exit(0);(*S).top = (*S).base;/ 栈底与栈顶相同表示一个空栈(*S

6、).stacksize = STACK_INIT_SIZE;return 1;Status StackEmpty(SqStack S) / 若栈S为空栈(栈顶与栈底相同的),则返回1,否则返回0。if(S.top = S.base) return 1;else return 0;Status Push(SqStack *S, SElemType e)/插入元素e为新的栈顶元素。if(*S).top - (*S).base = (*S).stacksize) / 栈满,追加存储空间 (*S).base = (SElemType *)realloc(*S).base , (*S).stacksiz

7、e + STACKINCREMENT) * sizeof(SElemType);if( !(*S).base ) exit(0);(*S).top = (*S).base+(*S).stacksize;(*S).stacksize += STACKINCREMENT;*(*S).top)+=e;return 1;Status Pop(SqStack *S,SElemType *e)/若栈不空,则删除S的栈顶元素,用e返回其值,并返回1;否则返回0。if(*S).top = (*S).base) return 0;*e = *-(*S).top;return 1;2. 查找路径的算法,简单算法说

8、明如下:Status MazePath(PosType start,PosType end) / 若迷宫maze中存在从入口start到出口end的通道,则求得一条 / 存放在栈中(从栈底到栈顶),并返回1;否则返回0 InitStack(&S); curpos=start; curstep=1;doif(Pass(curpos)/ 当前位置可以通过,即是未曾走到过的通道块 FootPrint(curpos); / 留下足迹 e =( curstep, curpos,1);Push(&S,e); / 入栈当前位置及状态 if(curpos.x=end.x&curpos.y=end.y) / 到

9、达终点(出口) return 1;curpos=NextPos(curpos,e.di);else/ 当前位置不能通过 if(!StackEmpty(S)Pop(&S,&e); / 退栈到前一位置 curstep-; / 前一位置处于最后一个方向(北) while(e.di=3&!StackEmpty(S)MarkPrint(e.seat); Pop(&S,&e); /留下不能通过的标记(-1) , 退回一步if(e.di3) / 没到最后一个方向(北) e.di+; Push(&S,e);/ 换下一个方向探索curpos=NextPos(e.seat,e.di); / 设定当前位置是该新方向

10、上的相邻块while(!StackEmpty(S);return 0;4 调试与分析4.1 调试过程在调试程序是主要遇到一下几类问题:1. 选择存储结构的问题:刚接到课设题目的时候,我就在想用什么来实现迷宫的存储。用线性表还是数组,最后综合考虑决定用栈和数组结合的方式来实现,用数组来建立迷宫和输出迷宫,用栈来查找路径并将生成的路径压入到栈中,因为栈有先入后出的优点,所以比较容易实现。2. 如何建立迷宫和怎么设置迷宫的问题:首先迷宫要有一定的范围怎么才能让迷宫有序的进行,于是我将迷宫的外围和障碍设置为0,所有的可走路径设置为1,这样迷宫就清晰可见。3. 如何去寻找路径问题 :这是整个程序的核心。

11、通过查找书籍得到了一个算法:若当前位置“可通”,则纳入当前路径,并继续朝下一位置搜索,即切换下一位置为当前位置,如此重复到达出口;若不可通,就退回到前一通道,然后继续寻找其他方向;若均不可通,则删除此路径。4. 界面问题:这里就是运用了switch(n)语句来实现的,这样增加了程序的实用性。4.2程序执行过程系统使用说明:1出现界面后选择1,进行迷宫大小的设计(这里设计3*3大小的):如图4.1所示 图4.1 2. 然后选择2,开始设计迷宫的内部:如图4.2所示 图4.23. 选择3,观察设计的是否满足你的要求:如图4.3所示 图4.34. 选择4,输入迷宫的起点和终点:如图4.4所示 图4.

12、45. 选择5,查看结果(路径由1.2.3.4.5表示出来):如图4.5所示 图4.56选择0,退出程序。参考文献1 严蔚敏,吴伟民.数据结构M.北京:清华大学出版社,2007. 2 胡圣荣, 周霭如, 罗穗萍.数据结构教程与题解M.北京:清华大学出版社,2011.3 谭浩强.C程序设计M.北京:清华大学出版社,2005.4 袁平波.数据结构实验指导M.合肥:中国科学技术大学出版社.2010. 5 殷人昆.数据结构M.北京:清华大学出版社.2011.6 宁正元.算法与数据结构习题精解和实验指导M.北京. 清华大学出版社.2007.7 陈媛.算法与数据结构.第2版M.北京. 清华大学出版社.20

13、11.附 录(关键部分程序清单)程序代码#include#include#include#include/ 迷宫坐标位置类型typedef struct int x;/ 行值 int y;/ 列值 PosType;#define MAXLENGTH 25 / 设迷宫的最大行列为25 typedef int MazeTypeMAXLENGTHMAXLENGTH; / 迷宫数组行列 typedef struct / 栈的元素类型 int ord; / 通道块在路径上的序号 PosType seat; / 通道块在迷宫中的坐标位置 int di; / 从此通道块走向下一通道块的方向(03表示东北)

14、SElemType;/ 全局变量 MazeType m; / 迷宫数组 int curstep=1; / 当前足迹,初值为1 #define STACK_INIT_SIZE 10/ 存储空间初始分配量 #define STACKINCREMENT 2/ 存储空间分配增量 / 栈的顺序存储表示 typedef struct SqStackSElemType *base;/ 在栈构造之前和销毁之后,base的值为NULL SElemType *top;/ 栈顶指针 int stacksize;/ 当前已分配的存储空间,以元素为单位 SqStack;/ 顺序栈/构造一个空栈Sint InitStac

15、k(SqStack *S)/ 为栈底分配一个指定大小的存储空间(*S).base = (SElemType *)malloc(STACK_INIT_SIZE*sizeof(SElemType);if( !(*S).base )exit(0);(*S).top = (*S).base;/ 栈底与栈顶相同表示一个空栈(*S).stacksize = STACK_INIT_SIZE;return 1;/ 若栈S为空栈(栈顶与栈底相同的),则返回1,否则返回0。int StackEmpty(SqStack S)if(S.top = S.base)return 1;elsereturn 0;/插入元素e

16、为新的栈顶元素。int Push(SqStack *S, SElemType e)if(*S).top - (*S).base = (*S).stacksize)/ 栈满,追加存储空间(*S).base = (SElemType *)realloc(*S).base , (*S).stacksize + STACKINCREMENT) * sizeof(SElemType);if( !(*S).base )exit(0);(*S).top = (*S).base+(*S).stacksize;(*S).stacksize += STACKINCREMENT;*(*S).top)+=e;retu

17、rn 1;/若栈不空,则删除S的栈顶元素,用e返回其值,并返回1;否则返回0。int Pop(SqStack *S,SElemType *e)if(*S).top = (*S).base)return 0;*e = *-(*S).top; / 这个等式的+ * 优先级相同,但是它们的运算方式,是自右向左return 1;/ 定义墙元素值为0,可通过路径为1,不能通过路径为-1,通过路径为足迹/ 当迷宫m的b点的序号为1(可通过路径),return 1; 否则,return 0。int Pass(PosType b) if(mb.xb.y=1)return 1;elsereturn 0;void

18、 FootPrint(PosType a) / 使迷宫m的a点的序号变为足迹(curstep),表示经过ma.xa.y=curstep;/ 根据当前位置及移动方向,返回下一位置 PosType NextPos(PosType c,int di)PosType direc4=0,1,1,0,0,-1,-1,0; / 行增量,列增量 / 移动方向,依次为东南西北 c.x+=direcdi.x;c.y+=direcdi.y;return c;/ 使迷宫m的b点的序号变为-1(不能通过的路径)void MarkPrint(PosType b) mb.xb.y=-1;/ 若迷宫maze中存在从入口sta

19、rt到出口end的通道,则求得一条 / 存放在栈中(从栈底到栈顶),并返回1;否则返回0 int MazePath(PosType start,PosType end) SqStack S;PosType curpos;SElemType e;InitStack(&S);curpos=start;doif(Pass(curpos)/ 当前位置可以通过,即是未曾走到过的通道块 FootPrint(curpos); / 留下足迹 e.ord=curstep;e.seat.x=curpos.x;e.seat.y=curpos.y;e.di=0;Push(&S,e); / 入栈当前位置及状态 curs

20、tep+; / 足迹加1 if(curpos.x=end.x&curpos.y=end.y) / 到达终点(出口) return 1;curpos=NextPos(curpos,e.di);else/ 当前位置不能通过 if(!StackEmpty(S)Pop(&S,&e); / 退栈到前一位置 curstep-;while(e.di=3&!StackEmpty(S) / 前一位置处于最后一个方向(北)MarkPrint(e.seat); / 留下不能通过的标记(-1) Pop(&S,&e); / 退回一步 curstep-;if(e.di3) / 没到最后一个方向(北) e.di+; / 换

21、下一个方向探索Push(&S,e); curstep+;/ 设定当前位置是该新方向上的相邻块curpos=NextPos(e.seat,e.di);while(!StackEmpty(S);return 0;/ 输出迷宫的结构 void Print(int x,int y) int i,j;for(i=0;ix;i+)for(j=0;jy;j+)printf(%3d,mij);printf(n); void main()PosType begin,end;int i,j,x,y,x1,y1,n,k;dosystem(cls); /清屏函数printf( nnn);printf( 1请输入迷宫的

22、行数,列数(包括外墙)n);printf( 2请输入迷宫内墙单元数n);printf( 3迷宫结构如下n);printf( 4输入迷宫的起点和终点n);printf( 5输出结果n);printf( 0退出n);printf(nn请选择 ); scanf(%d,&n);switch(n)case 1: printf(请输入迷宫的行数,列数(包括外墙):(空格隔开); scanf(%d%d, &x, &y); for(i=0;ix;i+) / 定义周边值为0(同墙) m0i=0;/ 迷宫上面行的周边即上边墙 mx-1i=0;/ 迷宫下面行的周边即下边墙 for(j=1;jy-1;j+) mj0=

23、0;/ 迷宫左边列的周边即左边墙 mjy-1=0;/ 迷宫右边列的周边即右边墙 for(i=1;ix-1;i+)for(j=1;jy-1;j+)mij=1; / 定义通道初值为1 break; case 2: printf(请输入迷宫内墙单元数:); scanf(%d,&j); printf(请依次输入迷宫内墙每个单元的行数,列数:(空格隔开)n); for(i=1;i=j;i+) scanf(%d%d,&x1,&y1);mx1y1=0; break; case 3:Print(x,y);printf(输入0退出);scanf(%d,&k);break; case 4: printf(请输入起

24、点的行数,列数:(空格隔开)); scanf(%d%d,&begin.x,&begin.y); printf(请输入终点的行数,列数:(空格隔开)); scanf(%d%d,&end.x,&end.y);break; case 5: if(MazePath(begin,end) / 求得一条通路 printf(此迷宫从入口到出口的一条路径如下:n);Print(x,y); / 输出此通路 elseprintf(此迷宫没有从入口到出口的路径n);printf(输入0退出);scanf(%d,&k);break;while(n!=0);课程设计总结:本次课程设计是一个关于迷宫求解的问题,虽然刚听到

25、有一些迷茫但是通过老师和同学的帮助最后还是有了结果,同时有了很多的体会和经验。1. 课程设计涉及很多的范围,这就需要我重新的温习以前学过的C语言的知识和数据结构的算法,别且通过这个过程我又发现了我自身的不足,同时也巩固了我的C语言和数据结构。这对我以后的学习是非常有帮助的。2. 同时在这次程序设计过程中,我自己有很多不会或者不懂的地方,这时候就会有老师和同学的帮助,帮助我解决问题,同时我也会对这个知识点有更加深刻的了解。而且大家在交流不同的思路,我也可以了解更多的算法,这样我的理解思路有可以增加,这样也增加了我和同学老师的情谊,这就是现代社会所讲的团队合作。3. 这次课程设计时间因为中间有考试,所以时间有一点短,但我在过程中所体会的快乐,程序结果出来时刻的那种喜悦是让我无法忘记的。这种在学习中编程,在于大家探讨中学习,会使我们每个人都有很大的进步,也让我们明白了团队的重要性,这对我也后的学习和生活有很大的帮助。指导教师评语:指导教师(签字): 年 月 日课程设计成绩

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 建筑/施工/环境 > 项目建议


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号