迷宫问题——数据结构课程设计迷宫问题.doc
《迷宫问题——数据结构课程设计迷宫问题.doc》由会员分享,可在线阅读,更多相关《迷宫问题——数据结构课程设计迷宫问题.doc(27页珍藏版)》请在三一办公上搜索。
1、*实践教学* 兰州理工大学计算机与通信学院2012年春季学期 算法与数据结构 课程设计题 目: 迷宫问题 专业班级:计算机科学与技术一班 姓 名: 程文鑫 学 号: 10240127 指导教师: 张永 成 绩: 目 录摘 要3前 言4正 文5一、采用c+语言定义相关的数据类型5二、各模块的伪码算法6三、函数的调用关系图10四、调试分析11五、测试结果111、开始界面122、自动生成迷宫运行情况123、键盘输入迷宫运行情况14总 结16致 谢17参考文献18附 录19源程序(带注释)19摘 要本程序主要是对任意给定的迷宫,求出一条从入口到出口的通路,或得出没有通路的结论。使我们基本掌握线性表及栈
2、上基本运算的实现,进一步理解和熟练掌握课本中所学的各种数据结构,学会如何把学到的知识用于解决实际问题,培养我们的动手能力。1、生成迷宫:根据提示输入数据,然后生成一个8行8列的迷宫。2、探索迷宫路径:由输入的入口位置开始,对相邻的(上,下,左,右)四个方向的方块进行探索,若可通则“纳入路径”,否则顺着“来向”退到“前一通道块”,朝着“来向”之外的其它方向继续探索。3、保存迷宫路径:若探索到出口则把探索到的路径压入另一个栈中,并最后弹出路径坐标,输出在屏幕上。 关键字:栈,栈的存储结构,出栈与入栈前 言 求迷宫中从入口到出口的所有路径是一个经典的程序设计问题。由于计算机解迷宫时,通常用的是“穷举
3、求解”的方法,即从入口出发,顺某一方向向前探索,若能走通,则继续往前走;否则沿原路退回,换一个方向再继续探索,直至所有可能的通路都探索到为止。为了保证在任何位置上都能沿原路退回,显然需要用一个后进先出的结构来保存从入口到当前位置的路径。因此,在求迷宫通路的算法中应用“栈”也就是自然而然的事。迷宫问题要求,所求路径必须是简单路径,即在求得路径上不能同时重复出现同一通道。在迷宫中用1和0分别表示迷宫中的通路和障碍。 首先,输入迷宫数据,在计算机的屏幕上显示一个8行8列的矩阵表示迷宫。矩阵中的每个数据或为通路(以0表示),或为墙(以1表示),所求路径必须是简单路径,即在求得的路径上不能重复出现同一道
4、块。 其次,假设“当前位置”指的是“在搜索过程中某一时刻所在图中某个方块位置”,则求迷宫中一条路径的算法的基本思想是:若当前位置“可通”,则“纳入当前路径”,并继续朝“下一个位置”探索,即切换“下一位置”为“当前位置”,如此重复直到到达出口;若当前位置“不可通”,则应顺着“来向”退回到“前一通道块”,然后朝着除“来向”,之外的其它方向继续探索,若该通道块的四周四个方块均“不可通”,则应该从“当前路径”上删除该通道块,所谓“下一个位置”指的是“当前位置”四周四个方向(上,下,左,右)上相邻的方块。假设以栈S记录“当前路径”,则栈顶中存放的是“当前路径上最后一个通道块”。由此,“纳入路径”的操作为
5、“当前位置入栈”;从当前路径删除前一通道块的操作为“出栈”。 最后,若找到出口,则从栈中弹出数据,在屏幕上显示从入口到出口的路径坐标。最后希望通过对该课题的设计,理解和掌握所学到的各种数据结构,学会把学到的知识应用于解决实际的问题当中,培养自己的动手能力。正 文一、采用c+语言定义相关的数据类型1、定义坐标(X,Y):#include#includeusing namespace std;struct Coor int row; int column; int direction; ; 2、定义方向:struct Move int row;int column;3、定义/链表结点:struct
6、 LinkNode Coor data;LinkNode *next;4、定义栈:class stackprivate:LinkNode *top; public:stack(); stack(); void Push(Coor data); Coor Pop(); Coor GetPop(); void Clear(); bool IsEmpty(); ;5、定义迷宫定义移动的4个方向:Move move4=0,1,1,0,0,-1,-1,0;6、几个函数功能的描述: stack(); /构造函数,置空栈 stack(); /析构函数void Push(Coor data); /把元素dat
7、a压入栈中Coor Pop(); /使栈顶元素出栈Coor GetPop(); /取出栈顶元素void Clear(); /把栈清空bool IsEmpty(); /判断栈是否为空bool Mazepath(int *maze,int m,int n); /寻找迷宫maze中从(0,0)到(m,n)的路径 /到则返回true,否则返回falsevoid PrintPath(stack p); /输出迷宫的路径void PrintPath2(int m,int n,stack p,int *maze); /输出路径void Restore(int *maze,int m,int n); /恢复迷
8、宫二、各模块的伪码算法1、根据输入产生一个8*8的迷宫:m=a; n=b; maze=new int *m+2; /申请长度等于行数加2的二级指针 for(i= 0;im+2;i+) /申请每个二维指针的空间 mazei=new intn+2;for(i=1;i=m;i+) for(j=1;jmazeij;cout是否保存新迷宫?n;coutchoose;if(choose=Y|choose=y)char ch;ofstream fop(Newtest.txt); for(i=1;i=m;i+)for(j=1;j=n;j+)ch=0+mazeij;fopch;fopendl;flush(cou
9、t);fop.close(); /给迷宫的四周加一堵墙,即把迷宫四周定义为1for(i=0;im+2;i+) mazei0=mazein+1=1;for(i=0;in+2;i+) maze0i=mazem+1i=1;for(int p=0;pm+2;+p)for(int q=0;q=n+2;+q)if(mazepq=0)cout=1)cout;coutendl;return maze; /返回存贮迷宫的二维指针maze2、探索路径函数:bool Mazepath(int *maze,int m,int n) /寻找迷宫maze中从(0,0)到(m,n)的路径 /到则返回true,否则返回fal
10、sestack q,p; /定义栈p、q,分别存探索迷宫的存储和路径过程Coor Temp1,Temp2; int row,column,loop;Temp1.row=1;Temp1.column=1;q.Push(Temp1); /将入口位置入栈p.Push(Temp1);maze11=8; /标志入口位置已到达过while(!q.IsEmpty() /栈q非空,则反复探索Temp2=q.GetPop(); /获取栈顶元素if(!(p.GetPop().row=q.GetPop().row&p.GetPop().column=q.GetPop().column) p.Push(Temp2);
11、 /如果有新位置入栈,则把上一个探索的位置存入栈pfor(loop=0;loop4;loop+) /探索当前位置的4个相邻位置row=Temp2.row+moveloop.row; /计算出新位置x位置值column=Temp2.column+moveloop.column; /计算出新位置y位置值if(mazerowcolumn=0) /判断新位置是否可达Temp1.row=row;Temp1.column=column;mazerowcolumn=8; /标志新位置已到达过q.Push(Temp1); /新位置入栈if(row=(m)&(column=(n) /成功到达出口Temp1.ro
12、w=m;Temp1.column=n;Temp1.direction=0;p.Push(Temp1); /把最后一个位置入栈char choose;coutchoose; if(choose=1) PrintPath(p); /坐标显示输出 Restore(maze,m,n); elsePrintPath2(m,n,p,maze); /矩阵显示输出 Restore(maze,m,n); return 1; /表示成功找到路径if(p.GetPop().row=q.GetPop().row&p.GetPop().column=q.GetPop().column) /如果没有新位置入栈,则返回到上
13、一个位置p.Pop();q.Pop();return 0; /表示查找失败,即迷宫无路经3、输出迷宫void PrintPath(stack p) /输出路径cout迷宫的路径为n;coutdata=p.Pop(); /取栈p的顶点元素,即第一个位置t.Push(temp-data); /第一个位置入栈tdelete temp; /释放空间while(!p.IsEmpty() /栈p非空,则反复转移temp=new LinkNode;temp-data=p.Pop(); /获取下一个位置 /得到行走方向a=t.GetPop().row-temp-data.row; /行坐标方向b=t.GetP
14、op().column-temp-data.column; /列坐标方向if(a=1) temp-data.direction=1; /方向向下,用1表示else if(b=1) temp-data.direction=2; /方向向右,用2表示else if(a=-1) temp-data.direction=3; /方向向上,用3表示else if(b=-1) temp-data.direction=4; /方向向左,用4表示t.Push(temp-data); /把新位置入栈delete temp;cout坐标(row,column,direction)中x在指向当前位置所在的行数,y指
15、向当前位置所在的列数,;coutdirection表示下一位置走向。endl; /输出路径,包括行坐标,列坐标,下一个位置方向while(!t.IsEmpty() /栈非空,继续输出data=t.Pop();cout(data.row,data.column,data.direction,; /输出行坐标,列坐标switch(data.direction) /输出相应的方向 case 1:cout)n;break;case 2:cout)n;break;case 3:cout)n;break;case 4:cout)n;break;case 0:cout)n;break;void PrintP
16、ath2(int m,int n,stack p,int *maze) /输出路径cout迷宫的路径为n;for (int i = 0; i m+2; +i )for (int j = 0; j n+2; +j)cout mazeij ;cout =0&ch=9都可以执行,但是在执行过程中显示迷宫时有“吃墙”现象,如图: 经过反复调试程序,最后发现在定义 出错,后来改为后,吃图现象在没有发生,如图;2、算法的时间复杂度和空间复杂度空间复杂度:O(1);时间复杂度随机生成迷宫:O(n*n);探寻出口:O(n*n);输出迷宫:O(n*n);判断当前位置可通:O(1)。五、测试结果 1、开始界面 2
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 迷宫 问题 数据结构 课程设计

链接地址:https://www.31ppt.com/p-2396972.html