1、数据结构 迷宫求解问题 课程设计江西理工大学应用科学学院 数据结构课程设计报告题目: 迷宫求解 班级: 姓名: 学号: 完成日期: 一、课程设计概述.2二、问题描述. 2三、需求分析. 2四、概要设计. 2 五、存储结构. 4六、流程图 . 4 七、详细设计. 4八、调试分析.8九、运行结果及分析. 8十、参考文献. 10十一、主程序.10一、课程设计概述本次数据结构课程设计主要完成用栈来实现迷宫求解问题。 使用语言:C编译环境:VC6.0二、问题描述迷宫问题是取自心理学的一个古典实验。在该实验中,把一只老鼠从一个无顶大盒子的门放入,在盒子中设置了许多墙,对行进方向形成了多处阻挡。盒子仅有一个
2、出口,在出口处放置一块奶酪,吸引老鼠在迷宫中寻找道路以到达出口。对同一只老鼠重复进行上述实验,一直到老鼠从入口走到出口,而不走错一步。老鼠经过多次试验最终学会走通迷宫的路线。设计一个计算机程序对任意设定的矩形迷宫如下图A所示,求出一条从入口到出口的通路,或得出没有通路的结论。 图1-1.三、需求分析要求设计程序输出如下:(1) 建立一个大小为mn的任意迷宫(迷宫数据可由用户输入或由程序自动生成),并在屏幕上显示出来;(2)找出一条通路的二元组(i,j)数据序列,(i,j)表示通路上某一点的坐标。(3)用一种标志(如数字8)在迷宫中标出该条通路;(4)在屏幕上输出迷宫和通路;(5)上述功能可用菜
3、单选择。四、概要设计设定栈的抽象数据类型定义为:ADT stack数据对象:D=ai|aicharset,i=1,2,n,n0数据关系:R1=|ai-1,aiD,i=2,n基本操作:InitStack(&S)/操作结果:构造一个空栈S。DestroyStack(&S)/初始条件:栈S已存在。/操作结果:销毁栈S。ClearStack(&S)/初始条件:栈S已存在。/操作结果:将S清为空栈。StackLength(&S)/初始条件:栈S已存在。/操作结果:返回栈S的长度。StackEmpty(&S)/初始条件:栈S已存在。/操作结果:若S为空栈,则返回TRUE,否则返回FALSE。GetTop(
4、S,&e)/初始条件:栈S已存在。/操作结果:若栈S不空,则以e返回栈顶元素。Push(&S,e)/初始条件:栈S已存在。/操作结果:在栈S的栈顶插入新的栈顶元素e。Pop(&S,&e)/初始条件:栈S已存在。/操作结果:删除S的栈顶元素,并以e返回其值。StackTraverse(S,visit( )/初始条件:栈S已存在。/操作结果:从栈底到栈顶依次对S中的每个元素调用函数visit( ).ADTstack五存储结构struct point int row; /通道块在路径上的“行”位置 int col; /迷宫的“出口”I nt predecessor; /该通道的“前趋”queue51
5、2;六、流程图图1-2七、详细设计实现概要设计中定义的所有数据类型及操作的伪代码算法1.节点类型和指针类型迷宫矩阵类型:int mazeM+2N+2;为方便操作使其为全局变量迷宫中节点类型及队列类型:struct pointint row,col,predecessor que5122.迷宫的操作(1)手动生成迷宫void shoudong_maze(int m,int n)定义i,j为循环变量for(i=m)for(j=n)输入mazeij的值(2)自动生成迷宫void zidong_maze(int m,int n)定义i,j为循环变量for(i=m)for(j=n)mazeij=rand
6、()%2 /由于rand()产生的随机数是从0到RAND_MAX,RAND_MAX是定义在stdlib.h中的,其值至少为32767),要产生从X到Y的数,只需要这样写:k=rand()%(Y-X+1)+X;(3)打印迷宫图形void print_maze(int m,int n)用i,j循环变量,将mazeij输出 、(4)打印迷宫路径void result_maze(int m,int n)用i,j循环变量,将mazeij输出 、(5)搜索迷宫路径迷宫中队列入队操作void enqueue(struct point p)将p放入队尾,tail+迷宫中队列出队操作struct point d
7、equeue(struct point p)head+,返回quehead-1判断队列是否为空int is_empty()返回head=tail的值,当队列为空时,返回0访问迷宫矩阵中节点void visit(int row,int col,int maze4141)建立新的队列节点visit_point,将其值分别赋为row,col,head-1,mazerowcol=2,表示该节点以被访问过;调用enqueue(visit_point),将该节点入队路径求解void mgpath(int maze4141,int m,int n)先定义入口节点为struct point p=0,0,-1,
8、从maze00开始访问。如果入口处即为障碍,则此迷宫无解,返回0 ,程序结束。否则访问入口节点,将入口节点标记为访问过mazep.rowp.col=2,调用函数enqueue(p)将该节点入队。判断队列是否为空,当队列不为空时,则运行以下操作: 调用dequeue()函数,将队头元素返回给p,如果p.row=m-1且p.col=n-1,即到达出口节点,即找到了路径,结束如果p.col+1n且mazep.rowp.col+1=0,说明未到迷宫右边界,且其右方有通路,则visit(p.row,p.col+1,maze),将右边节点入队标记已访问如果p.row+10且mazep.rowp.col-1
9、=0,说明未到迷宫左边界,且其左方有通路,则visit(p.row,p.col-1,maze),将左方节点入队标记已访问如果p.row-10且mazep.row-1p.col=0,说明未到迷宫上边界,且其上方有通路,则visit(p.row,p.col+1,maze),将上方节点入队标记已访问访问到出口(找到路径)即p.row=m-1且p.col=n-1,则逆序将路径标记为3即mazep.rowp.col=3;while(p.predecessor!=-1)p=queuep.predecessor; mazep.rowp.col=3; 最后将路径图形打印出来。3.菜单选择while(cycle
10、!=(-1) 手动生成迷宫 请按:1 自动生成迷宫 请按:2 退出 请按:3 scanf(%d,&i); switch(i) case 1:请输入行列数(如果超出预设范围则提示重新输入) shoudong_maze(m,n); print_maze(m,n); mgpath(maze,m,n);if(X!=0) result_maze(m,n);case 2 :请输入行列数(如果超出预设范围则提示重新输入) zidong_maze(m,n);print_maze(m,n);mgpath(maze,m,n); if(X!=0) result_maze(m,n);case 3:cycle=(-1)
11、; break;注:具体源代码见附录八、调试分析在调试过程中,首先使用的是栈进行存储,但是产生的路径是多条或不是最短路径,所以通过算法比较,改用此算法。九、运行结果及分析 1.程序主界面 图1-32.手动输入迷宫图1-4图1-53.自动生成迷宫图1-6图1-7十、参考文献1浩谭强.C程序设计M第2版.北京:清华大学出版社,2004年。2蔚严敏、吴伟民.数据结构M.北京:清华大学出版社,2OO5年。十一、主程序附录:#includestdlib.h#includestdio.h#define N 39#define M 39int X;int mazeN+2M+2;struct point in
12、t row,col,predecessor;queue512;int head=0,tail=0;void shoudong_maze(int m,int n) int i,j; printf(nn); printf(请按行输入迷宫,0表示通路,1表示障碍:nn); for(i=0;im;i+) for(j=0;jn;j+) scanf(%d,&mazeij);void zidong_maze(int m,int n) int i,j; printf(n迷宫生成中nn); system(pause); for(i=0;im;i+) for(j=0;jn;j+) mazeij=rand()%2;
13、/由于rand()产生的随机数是从0到RAND_MAX/RAND_MAX是定义在stdlib.h中的,其值至少为32767)/要产生从X到Y的数,只需要这样写:k=rand()%(Y-X+1)+X; void print_maze(int m,int n) int i,j; printf(n迷宫生成结果如下:nn); printf(迷宫入口n); printf(); for(i=0;im;i+) printf(n); for(j=0;jn;j+) if(mazeij=0) printf(); if(mazeij=1) printf(); printf(迷宫出口n);void result_ma
14、ze(int m,int n) int i,j; printf(迷宫通路(用表示)如下所示:nt); for(i=0;im;i+) printf(n); for(j=0;jn;j+) if(mazeij=0|mazeij=2) printf(); if(mazeij=1) printf(); if(mazeij=3) printf(); void enqueue(struct point p) queuetail=p; tail+;struct point dequeue() head+; return queuehead-1;int is_empty() return head=tail;v
15、oid visit(int row,int col,int maze4141) struct point visit_point=row,col,head-1; mazerowcol=2; enqueue(visit_point);int mgpath(int maze4141,int m,int n) X=1; struct point p=0,0,-1; if(mazep.rowp.col=1)printf(n=n);printf(此迷宫无解nn);X=0;return 0; mazep.rowp.col=2; enqueue(p); while(!is_empty() p=dequeue
16、(); if(p.row=m-1)&(p.col=n-1) break; if(p.col+1n)&(mazep.rowp.col+1=0) visit(p.row,p.col+1,maze); if(p.row+1=0)&(mazep.rowp.col-1=0) visit(p.row,p.col-1,maze); if(p.row-1=0)&(mazep.row-1p.col=0) visit(p.row-1,p.col,maze); if(p.row=m-1&p.col=n-1) printf(n=n); printf(迷宫路径为:n); printf(%d,%d)n,p.row,p.c
17、ol); mazep.rowp.col=3; while(p.predecessor!=-1) p=queuep.predecessor; printf(%d,%d)n,p.row,p.col); mazep.rowp.col=3; else printf(n=n); printf(此迷宫无解!nn);X=0; return 0;void main()int i,m,n,cycle=0;while(cycle!=(-1) printf(*n); printf( 欢迎进入迷宫求解系统n); printf( n); printf(*n); printf( 手动生成迷宫 请按:1n); printf
18、( 自动生成迷宫 请按:2n); printf( 退出 请按:3nn); printf(*n); printf(n); printf(请选择你的操作:n); scanf(%d,&i); switch(i) case 1:printf(n请输入行数:);scanf(%d,&m); printf(n); printf(请输入列数:);scanf(%d,&n); while(m39)|(n39) printf(n抱歉,你输入的行列数超出预设范围(0-39,0-39),请重新输入:nn); printf(请输入行数:);scanf(%d,&m); printf(n); printf(请输入列数:);s
19、canf(%d,&n); shoudong_maze(m,n); print_maze(m,n); mgpath(maze,m,n); if(X!=0) result_maze(m,n);printf(nnPressEnterContiue!n);getchar();while(getchar()!=n);break; case 2:printf(n请输入行数:);scanf(%d,&m); printf(n); printf(请输入列数:);scanf(%d,&n); while(m39)|(n39) printf(n抱歉,你输入的行列数超出预设范围(0-39,0-39),请重新输入:nn)
20、; printf(请输入行数:);scanf(%d,&m); printf(n); printf(请输入列数:);scanf(%d,&n); zidong_maze(m,n); print_maze(m,n); mgpath(maze,m,n); if(X!=0) result_maze(m,n); printf(nnPressEnterContiue!n);getchar();while(getchar()!=n);break; case 3:cycle=(-1);break; default:printf(n);printf(你的输入有误!n);printf(nPress Enter Contiue!n);getchar();while(getchar()!=n);break; 答辩与成绩考核答辩问答成绩评定项目权重成绩1、设计过程中出勤、能力、水平、态度等方面2、课设书写及作品质量程度3、答辩4、系统总成绩
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1