}
(二)栈的生成
图3:
栈的实现功能图
该模块的具体代码如下所示。
Maze:
:
Maze()
{
}
Maze:
:
~Maze()
{
}
intMaze:
:
InitStack(PLStack&S)//构造空栈
{
S=NULL;
return1;
}
intMaze:
:
StackEmpty(PLStackS)//判断栈是否为空
{
if(S==NULL)
return1;
else
return0;
}
intMaze:
:
Push(PLStack&S,lianzhane)//在栈中放入一个新的数据元素(进栈)
{
PLStackp;
p=(PLStack)malloc(sizeof(LStack));//申请新的栈顶结点空间
p->elem=e;//将元素值置入结点数据域
p->next=S;//原栈顶结点昨晚新结点后继
S=p;//将新结点置为栈顶
return1;
}
intMaze:
:
Pop(PLStack&S,lianzhan&e)//栈顶元素出栈
{
PLStackp;
if(!
StackEmpty(S))
{
e=S->elem;
p=S;
S=S->next;
deletep;//释放结点
return1;
}
else
return0;
}
(三)整个系统的生成流程图
N
Y
YN
Y
YN
YN
N
Y
五、程序测试与步骤
(一)测试迷宫与栈问题的可通程序设计
测试该函数使用的测试方法,测试的具体步骤,测试用例的选取,测试的结果。
图4:
在测试中可以找到迷宫和踩雷路径
(二)测试迷宫与栈问题的不可通程序设计
测试该函数使用的测试方法,测试的具体步骤,测试用例的选取,测试的结果。
图5:
在测试中并未找到迷宫路径
六、总结
迷宫求解首先实现了随机输入m和n的值,自己设定一个矩阵的行与列,在给定空间内控制了迷宫的范围,再从电脑中输入“0”为通路,“1”为围墙显示出一个迷宫的雏形来,最终通过for循环给写好的迷宫加一个围墙,得到我们想要的结果,并且给定迷宫的入口和出口,从而寻找到迷宫的可同路径或者说入口处进入后,并不能找到可通路径从而退出。
而我定义“5”为地雷,这样小老鼠就能愉快的踩雷回到起点了,重新进行下一步的通路探测。
也可以循环使用此程序。
系统在设计过程中我只考虑到了迷宫中给定入口和出口,在选择路径时仅有东、西、南、北,这四个方向寻找出口,而不是更加全面的在东南、东北、西南、西北,方向同时寻找迷宫的出路,因此这一点是我认为考虑很不周到的,但是我已经对这个功能有了初步设想,利用移动两次下标进行东南、东北、西南、西北的方向实现,希望能够在今后的学习中更好的完善,让这个迷宫求解更加的充实。
我的收获是这次的课程设计的内容是使用C++和数据结构来实现栈的应用,这对我来说是个很具有挑战性的任务,虽然只做了一个迷宫与栈的问题,而且运行起来有很大的局限性,但通过两星期的设计也从中学到了不少的东西,更多的了解到了课本中丰富的内容。
《数据结构》是一门实践性较强的课程,为了学好这门课程,必须在掌握理论知识的同时,加强上机实践。
同时再次深刻的了解了数据结构中数组与基本函数之间的调用,并且使用顺序结构,选择结构,循环结构的嵌套,根据实际问题的需要实现迷宫与栈问题。
在本次课程设计中,我明白了理论与实际相结合的重要性,并提高了自己组织数据及编写程序的能力,挺高了综合运用所学知识的能力。
七、附件(代码、部分图表)
#include
usingnamespacestd;
#defineM20//行
#defineN20//列
intm,n;
intdiradd[4][2]={{0,1},{1,0},{0,-1},{-1,0}};//行增量和列增量方向依次为东西南北
structZuobiao//定义迷宫内点的坐标类型
{
intx;
inty;
};
structlianzhan//链栈元素
{
intx,y;//x行,y列
intd;//d为下一步的方向
};
typedefstructLStack//链栈
{
lianzhanelem;
structLStack*next;
}*PLStack;
/*************栈函数****************/
classMaze
{
public:
Maze();
~Maze();
intInitStack(PLStack&S);//构造空栈
intStackEmpty(PLStackS);//判断栈是否为空
intPush(PLStack&S,lianzhane);//在栈中放入一个新的数据元素(进栈)
intPop(PLStack&S,lianzhan&e);//栈顶元素出栈
/***************求迷宫路径函数***********************/
voidlujing();
voidinitmaze();
voidinput();
private:
intmaze[M][N];
structZuobiaostart,end;//start,end入口和出口的坐标
};
intmain()
{
ints;
Mazeexample;
cout<<"***********************************************************************"<cout<<"*********小老鼠吃奶酪*********"<cout<<"***********************************************************************"<cout<<"***********************************************************************"<cout<<"***********************************************************************"<example.initmaze();//建立迷宫
example.input();//输入
example.lujing();//路径
cout<cout<cout<cout<<"***********************************************************************"<cout<<"<<@@@@@按‘1’则可以继续玩游戏,按任意键‘GAMEOVER’!
@@@@@>>";
cin>>s;
if(s==1)
main();
else
cout<<"#####‘GAMEOVER!
!
’#####\n谢谢进入迷宫游戏!
"<return0;
}
Maze:
:
Maze()
{
}
Maze:
:
~Maze()
{
}
intMaze:
:
InitStack(PLStack&S)//构造空栈
{
S=NULL;
return1;
}
intMaze:
:
StackEmpty(PLStackS)//判断栈是否为空
{
if(S==NULL)
return1;
else
return0;
}
intMaze:
:
Push(PLStack&S,lianzhane)//在栈中放入一个新的数据元素(进栈)
{
PLStackp;
p=(PLStack)malloc(sizeof(LStack));//申请新的栈顶结点空间
p->elem=e;//将元素值置入结点数据域
p->next=S;//原栈顶结点昨晚新结点后继
S=p;//将新结点置为栈顶
return1;
}
intMaze:
:
Pop(PLStack&S,lianzhan&e)//栈顶元素出栈
{
PLStackp;
if(!
StackEmpty(S))
{
e=S->elem;
p=S;
S=S->next;
deletep;//释放结点
return1;
}
else
return0;
}
/***************求迷宫路径函数***********************/
voidMaze:
:
lujing(){
inti,j,d;
inta,b;
lianzhanelem,e;
PLStackS1,S2,S3;
InitStack(S1);
InitStack(S2);
InitStack(S3);
maze[start.x][start.y]=2;//入口点作上标记
elem.x=start.x;
elem.y=start.y;
elem.d=-1;//开始为-1
Push(S1,elem);
again:
while(!
StackEmpty(S1))//栈不为空有路径可走
{
Pop(S1,elem);
i=elem.x;
j=elem.y;
d=elem.d+1;//下一个方向
while(d<4)//试探东南西北各个方向
{
a=i+diradd[d][0];
b=j+diradd[d][1];
if(maze[a][b]==5)
{
while(S1)//逆置序列并输出迷宫路径序列
{
Pop(S1,e);
Push(S3,e);
}
maze[a][b]=1;
for(i=0;ifor(j=0;j{
if(maze[a][b]==2)
maze[a][b]=0;
}
cout<<"\n0=东1=南2=西3=北4=走出迷宫\n\n通路为(横坐标,列坐标,方向):
\n";
while(S3)
{
Pop(S3,e);
Push(S1,e);
cout<<"-->{"<}
cout<<"\n你在"<<"["<d=0;
gotoagain;
}
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);
cout<<"\n0=东1=南2=西3=北4=走出迷宫\n\n通路为(横坐标,列坐标,方向):
\n";
while(S1)//逆置序列并输出迷宫路径序列
{
Pop(S1,e);
Push(S2,e);
}
while(S2)
{
Pop(S2,e);
cout<<"-->{"<}
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++;
}
}
cout<<"抱歉,小老鼠走投无路没有吃到奶酪!
"<}
/*************建立迷宫*******************/
voidMaze:
:
initmaze()
{
inti,j;
//迷宫行,列
cout<<"请输入迷宫的行数:
m=";
cin>>m;
cout<<"请输入迷宫的列数:
n=";
cin>>n;
cout<<"*******************************************