您好,欢迎访问三七文档
目录一、系统开发的背景................................................................................................................1二、系统分析与设计................................................................................................................1(一)系统的分析....................................................................................................................1(二)系统的具体分析设计....................................................................................................2三、系统的功能要求.....................................................................................................................................2(一)系统模块结构设计........................................................................................................3四、系统的设计与实现................................................................................................................................4(一)在栈中实现迷宫的具体操作........................................................................................4(二)栈的生成........................................................................................................................6(三)整个系统的生成流程图……………………………………………………………….8五、系统测试............................................................................................................................9(一)测试迷宫与栈问题可通的程序设计…………..……………………………………….…….9(二)测试迷宫与栈问题不可通的程序设计…………………………………………..…..10六、总结………………………………………………………………………………………………...10七、附件(代码、部分图表).............................................................................................111迷宫与栈问题一、系统开发的背景迷宫与栈问题的课程设计相当于是一个小游戏的开发,它来源于多年以来,迷宫问题一直是令人感兴趣的题目。实验心理学家训练老鼠在迷宫中寻找食物。许多神秘主义小说家也曾经把英国乡村花园迷宫作为谋杀现场。于是,老鼠过迷宫问题就此产生,这是一个很有趣的计算机问题,主要利用“栈”是老鼠通过尝试的办法从入口穿过迷宫走到出口。迷宫只有两个门,一个叫做入口,另一个叫做出口。把一只老鼠从一个无顶盖的大盒子的入口处赶进迷宫。迷宫中设置很多隔壁,对前进方向形成了多处障碍,在迷宫的唯一出口处放置了一块奶酪,吸引老鼠在迷宫中寻找通路以到达出口。求解迷宫问题,即找出从入口到出口的路径。而数据结构则是数据的组织形式,可以用来表示特定的对象数据,在计算机中对数据的一种存储和组织形式,因此选用栈思想实现迷宫游戏的基本操作,也是我开发迷宫小游戏的基本背景。二、系统分析与设计(一)系统分析:迷宫问题通常是用“穷举求解”方法解决,即从入口出发,顺着某个方向进行搜索,若能走通,则继续往前走;否则沿着原路退回,换一个方向继续探索,直至出口位置,求得一条通路。假如所有可能的通路都探索到而未能到达出口,则所设定的迷宫没有通路。栈是一个后进先出的结构,2可以用来保存从入口到当前位置的路径。定义迷宫类型来存储迷宫数据,通常设定入口点的下标,出口点的下标,为处理方便起见,在迷宫的周围加一圈障碍,对于迷宫任何一个位置均约定为东、西、南、北四个方向可同。(二)系统具体设计在某个点上,按照一定的顺序(在本程序中顺序为上、右、下、左)对周围的墙、路进行判断(在本程序中分别用1、0)代替,若周围某个位置为0,则移动到该点上,再进行下一次判断;若周围的位置都为1(即没有通路),则一步步原路返回并判断有无其他通路,然后再次进行相同的判断,直到走到终点为止,或者确认没有任何通路后终止程序。要实现上述算法,需要用到栈的思想。栈里面压的是走过的路径,若遇到死路,则将该位置(在栈的顶层)弹出,再进行下一次判断;若遇到通路,则将该位置压栈并进行下一次判断。如此反复循环,直到程序结束。此时,若迷宫有通路,则栈中存储的是迷宫通路坐标的倒序排列,再把所有坐标顺序打印后,即可得到正确的迷宫通路。三、系统功能要求(1)首先实现一个以链表作存储结构的栈类型,然后编写一个求解迷宫的非归程序。求得的通路以三元组(i,j,d)的形式输出。其中:(i,j)指示迷宫中的一个坐标,d表示走到下一坐标的方向。如,对于下列数据的迷宫,输出一条通路为:(1,1,1),(1,2,2),(2,2,2),(3,2,3),(3,1,2),…。3(2)编写递归形式的算法,求得迷宫中所有可能的通路。(3)以方阵形式输出迷宫及其通路。(一)系统模块结构设计通过对系统功能的分析,迷宫与栈问题的功能如图1所示。图1:迷宫实现的主函数功能图通过上图的功能分析,把整个系统划分为2个模块:1、通过栈后进先出的结构,实现栈判断,首先判断栈是否为空,如果不为空,则实现栈中基本的入栈,出栈的实现。顺序栈是用一组地址连续的内存单元依次保存栈中的运算规则,在链式存储中链表首部head指针所指向元素为栈顶元素,栈表尾部指向地址为NULL为栈底。2、借助函数的嵌套与使用,由while语句对整体进行控制,return语句控制跳出函数,判断在迷宫中是否有出路,如果有出路,则通过东,西,南,北的方向进行路径的输出;如果无出路,则说明此迷宫不能走出。主函数初始化栈入栈出栈判断栈是否为空判断方向留下足迹判断能否通过初始化迷宫求解所有路径输出迷宫留下标记4四、系统的设计与实现(一)在栈中实现迷宫的基本操作分析:首先输出表头,然后依次输入想要实现的步骤。功能图如图2所示。图2:迷宫的实现功能图入口,出口位置传人方法里判断当前是否通过循环不结束,无解迷宫将元素入栈是否到达迷宫出口右边是否存在通路上边是否存在通路下边是否存在通路左边是否存在通路存在结点入栈有解迷宫5该模块的具体代码如下所示。voidlujing(structZuobiaostart,structZuobiaoend,intmaze[M][N],intdiradd[4][2]){inti,j,d;inta,b;lianzhanelem,e;PLStackS1,S2;InitStack(S1);InitStack(S2);maze[start.x][start.y]=2;//入口点作上标记elem.x=start.x;elem.y=start.y;elem.d=-1;//开始为-1Push(S1,elem);while(!StackEmpty(S1))//栈不为空有路径可走{Pop(S1,elem);i=elem.x;j=elem.y;d=elem.d+1;//下一个方向while(d4)//试探东南西北各个方向{a=i+diradd[d][0];b=j+diradd[d][1];if(a==end.x&&b==end.y&&maze[a][b]==0)//如果到了出口{elem.x=i;elem.y=j;elem.d=d;Push(S1,elem);elem.x=a;elem.y=b;elem.d=4;//方向输出为-1判断是否到了出口Push(S1,elem);printf(\n0=东1=南2=西3=北4=走出迷宫\n\n通路为(横坐标,列坐标,方向):\n);while(S1)//逆置序列并输出迷宫路径序列{Pop(S1,e);Push(S2,e);}while(S2){Pop(S2,e);6printf(--{%d,%d,%d},e.x,e.y,e.d);}return;//选用return跳出两层循环}if(maze[a][b]==0)//找到可以前进的非出口的点{maze[a][b]=2;//标记走过此点elem.x=i;elem.y=j;elem.d=d;Push(S1,elem);//当前位置入栈i=a;//下一点转化为当前点j=b;d=-1;}d++;}}printf(迷宫没有路径,你走不出去啦!还想玩吗??\n);}(二)栈的生成图3:栈的实现功能图该模块的具体代码如下所示。栈的初始化栈为空入栈出栈7intInitStack(PLStack&S)//构造空栈{S=NULL;return1;}intStackEmpty(PLStackS)//判断栈是否为空{if(S==NULL)return1;elsereturn0;}intPush(PLStack&S,lianzhane)//在栈中放入一个新的数据元素{PLStackp;p=(PLStack)malloc(sizeof(LStack));//申请新的栈顶结点空间p-elem=e;//将元素值置入结点数据域p-next=S;//原栈顶结点昨晚新结点后继S=p;//将新结点置为栈顶return1;}intPop(PLStack&S,lianzhan&e)//栈顶元素出栈{PLStackp;if(!StackEmpty(S)){e=S-elem;p=S;S=S-next;free(p);//释放结点return1;}elsereturn0;}(三)整个系统的生成流程图8NYYNYYNYNNY初始化判断输入的数据创建并输入迷宫前方是否有墙前行左方右方后转右转左转是否找到出路终点输出迷宫通路用户输入迷宫大小输入迷宫行行输入迷宫列用户输入入口,出口结束9五、系测试(一)测试迷宫与栈问题的可通程序设计测试该函数使用的测试方法,测试的具体步骤,测试用例的选取,测试的结果。图4:在测试中可以找到迷宫路径10(二)测试迷宫与栈问题的不可通程序设计测试该函数使用的测试方法,测试的具体步骤,测试用例的选取,测试的结果。图5:在测试中并未找到迷宫路径六、总结迷宫小游戏首先实现了随机输入m和n的值,自己设定一个矩阵的行与列,在给定空间内控制了迷宫的范围,再从电脑中输入“0”为通路,“1”为围墙显示出一个迷宫的雏形来,最终通过for循环给写好的迷宫加一个围墙,得到我们想要的结果,并且给定迷宫的入口和出口,从而寻找到迷宫的可同路径或者说入口处进入后,并不能找到可通路径从而退出。也可以循环使用此小游戏。11系统在设计过程中我只考虑到了迷宫中给定入口和出口,在选择路径时仅有东、西、南、北,这四个方向寻找出口,而不是更加全面的在东南、东北、西南、西北
本文标题:迷宫与栈问题
链接地址:https://www.777doc.com/doc-2341758 .html