数据结构课程设计迷宫求解Word文档格式.docx
- 文档编号:21422074
- 上传时间:2023-01-30
- 格式:DOCX
- 页数:17
- 大小:41.59KB
数据结构课程设计迷宫求解Word文档格式.docx
《数据结构课程设计迷宫求解Word文档格式.docx》由会员分享,可在线阅读,更多相关《数据结构课程设计迷宫求解Word文档格式.docx(17页珍藏版)》请在冰豆网上搜索。
删除S的栈顶元素,并以e返回其值。
StackEmpty(&
S)初始条件:
若栈S为空栈,则返回TRUE,否则返回FALSE。
}ADTStack
2.设定迷宫的抽象数据类型为:
ADTmaze{
D={ai,j∈{‘’,‘#’、’@’、’*’},0<
=i<
=m+1,0<
=j<
=n+1,m,n<
=10}
R={ROW,COL}
ROW={<
ai-1,j,ai,j>
|ai-1,j,ai,j∈D,i=1,……,m+1,j=0,……n+1}
COL={<
ai,j-1,ai,j>
|ai,j-1,ai,j∈D,i=1,……,m+1,j=0,……n+1}
InitMaze(&
maze,a,row,col)
初始条件:
二维数组a[row+2][col+2]已存在,其中自第1行至第row+1行、每行中自第1
列至第col+1列的元素已有值,并且以值0表示通路,以值1表示障碍。
构造迷宫的字符数组,以空白字符表示通路,以字符‘#‘表示障碍,并在迷宫四周加上一圈障碍。
MazePath(&
maze,start,end)
迷宫maze已被赋值。
若迷宫maze中存在一条通路,则按照如下规定改变迷宫maze的状态;
以字符“*”表示路径上的位置,字符“@”表示”死胡同”;
否则迷宫的状态不变。
PrintMaze(maze)
迷宫maze已存在。
以字符形式输出迷宫。
}ADTmaze
3、为了实现上述操作,以栈为存储结构。
1)主程序模块:
Voidmain()
{初始化;
do{接受命令;
处理命令;
}while(命令!
=“退出”);
}
2)栈模块——实现栈抽象数据类型
3)迷宫模块——实习迷宫抽象数据类型
4.求解迷宫中一条通路的伪代码:
do{
若当前位置可通,
则{
将当前位置插入栈顶;
若该位置是出口位置,则结束;
否则切换当前位置的东临方块为新的当前位置;
}否则{
若栈不空且栈顶位置尚有其他方向未被探索,
则设定新的的当前位置为沿顺时针方向旋转找到的栈顶位置的下一相邻块
若栈不空但栈顶位置的四周均不可通,
则{
删去栈顶位置;
若栈不空,则重新测试新的栈顶位置,直至找到一个可通的相邻块或出栈至栈空。
}}}while(栈不空)
三、详细设计
1,位置设置
typedefstruct{
intr,c;
}PosType;
//位置类型
2)栈类型:
intstep;
//当前位置在路径上的序号
PosTypeseat;
//当前的坐标位置
intdi;
//往下一坐标位置的方向
}ElemType;
//栈的元素类型
typedefstructNodeType{
ElemTypedata;
NodeType*next;
}NodeType,*LinkType;
//结点类型,指针类型
LinkTypetop;
intsize;
}Stack;
//栈类型
3)迷宫类型:
typedefstruct{
intm,n;
chararr[15][15];
}MazeType;
voidInitMaze(MazeType&
maze,inta[100][100],introw,intcol)
{//按照用户输入的row行和col列的二维数组(元素为0或1)
intm,n;
printf("
请输入迷宫的行数和列数:
\n"
);
scanf("
%d%d"
&
row,&
col);
请输入迷宫数据,1为障碍,0为通路\n"
for(m=1;
m<
=row;
m++)
for(n=1;
n<
=col;
n++{
%d"
a[m][n]);
}printf("
数据输入结束.\n"
for(inti=0;
i<
=col+1;
i++)
{
a[0][i]=1;
a[row+1][i]=1;
for(intj=0;
j<
=row+1;
j++)
a[j][0]=1;
a[j][col+1]=1;
for(m=0;
for(n=0;
n++)
{
maze.arr[m][n]=a[m][n];
}
maze.m=row;
maze.n=col;
m++){
{printf("
maze.arr[m][n]);
for(i=0;
row+2;
{for(j=0;
col+2;
j++){
if(maze.arr[i][j]==1)
maze.arr[i][j]='
#'
;
else
'
}
i++){
{for(j=0;
%c"
maze.arr[i][j]);
printf("
}}
boolPass(MazeType&
maze,PosType&
curpos)//判断是否可达
if(maze.arr[curpos.r][curpos.c]=='
)
returntrue;
else
returnfalse;
voidFootPrint(MazeType&
curpos)
maze.arr[curpos.r][curpos.c]='
*'
//可达路径标识
voidMarkPrint(MazeType&
@'
//死胡同
PosTypeNextPos(PosType&
curpos,inta)
switch(a){
case1:
{curpos.c=curpos.c+1;
curpos.r=curpos.r;
returncurpos;
case2:
{
curpos.r=curpos.r+1;
curpos.c=curpos.c;
case3:
curpos.c=curpos.c-1;
curpos.r=curpos.r;
case4:
curpos.r=curpos.r-1;
default:
//方向错误返回原位置
boolMazePath(MazeType&
maze,PosTypestart,PosTypeend)
{//求解迷宫maze中,从入口start到出口end的一条路径,
//若存在则返回TRUE,否则返回FALSE
PosTypecurpos;
intcurstep;
StackS;
ElemTypee;
InitStack(S);
curpos=start;
//设定入口位置
curstep=1;
boolfound=false;
do{
if(Pass(maze,curpos))
{//当前位置可以通过,即是未曾走到过的通道块留下足迹
FootPrint(maze,curpos);
//做可以通过的标识
e.step=curstep;
e.seat=curpos;
e.di=1;
//为栈顶元素赋值
if(Push(S,e)!
=OK)returnERROR;
if(curpos.r==end.r&
&
curpos.c==end.c)found=true;
//如果到达终点返回true
else{
curpos=NextPos(curpos,1);
//下一位置是当前位置的东邻
curstep++;
//探索下一步
}//else
}//if
else
if(StackEmpty(S)!
=true)
{Pop(S,e);
while(e.di==4&
!
StackEmpty(S))
{
MarkPrint(maze,e.seat);
Pop(S,e);
curstep--;
}//while
if(e.di<
4){{
e.di++;
Push(S,e);
//换下个方向探索
curpos=NextPos(e.seat,e.di);
}//if
}//if
}while(!
StackEmpty(S)&
found);
DestoryStack(S);
if(found)returntrue;
elsereturnfalse;
}//没有找到路径
voidPrintMaze(MazeTypemaze)
{//将迷宫以字符型方阵形式输出到标准输出文件上
for(inti=0;
=maze.m+1;
for(intj=0;
=maze.n+1;
4)主函数:
intmain()
{charcmd;
Init();
ReadCommand(cmd);
//读入一个操作命令符
Interpret(cmd);
}while(cmd!
='
q'
四、运行结果及分析
测试结果如下
五、总结
通过这次试验,我学到了很多东西,比如说,开始根本不懂文件如何打开和如何传递,通过查资料才明白,头文件的编译,引用都是一个难题。
还有运用.H是要注意顺序。
这是一个很大型的设计题目,要充分搞懂各个部分之间的关系。
需要各个部分的完整结合,而且各个部分的基本知识应该很扎实。
通过这个实验,进一步提高了我的C语言水平。
附:
主要源代码
public.h:
enumStatus{
ERROR,
OK,
};
//状态类型
stack.h:
intStackSize(Stack&
S)
{returnS.size;
voidInitStack(Stack&
S.top=(LinkType)malloc(sizeof(NodeType));
S.top->
next=NULL;
S.size=0;
boolStackEmpty(Stack&
{if(S.top->
next==NULL)returntrue;
elsereturnfalse;
voidDestoryStack(Stack&
{LinkTypep;
while(S.top!
=NULL)
{
p=S.top;
S.top=S.top->
next;
free(p);
StatusPush(Stack&
S,ElemTypee)
{//若分配空间失败,就返回,否则成功则在S的栈顶插入新元素e
LinkTypeL;
L=(LinkType)malloc(sizeof(NodeType));
if(L==NULL)
returnERROR;
else
L->
next=S.top;
S.top=L;
data=e;
S.size++;
returnOK;
StatusPop(Stack&
S,ElemType&
e)
{//若栈不空则删除S的栈顶元素并以e带回其值
//否则返回错误
LinkTypep;
if(StackEmpty(S))returnERROR;
else{
p=S.top;
S.top=S.top->
e=p->
data;
S.size--;
returnOK;
}}
maze.h
//设置迷宫maze的值,包括加上边缘一圈的值
{scanf("
}、printf("
{a[0][i]=1;
{a[j][0]=1;
{maze.arr[m][n]=a[m][n];
{if(maze.arr[i][j]==1)maze.arr[i][j]='
elsemaze.arr[i][j]='
}}
{if(maze.arr[curpos.r][curpos.c]=='
)returntrue;
elsereturnfalse;
curpos){
}//死胡同
curpos,inta){
curpos.c=curpos.c+1;
returncurpos;
else{curpos=NextPos(curpos,1);
{Pop(S,e);
{MarkPrint(maze,e.seat);
curstep--;
}//while
4)
{e.di++;
Push(S,e);
//没有找到路径
{for(intj=0;
j++)printf("
testmaze.cpp
#include"
public.h"
malloc.h"
#include<
stdlib.h>
stdio.h>
stack.h"
maze.h"
inta[100][100];
introw,col;
MazeTypemaze;
PosTypestart,end;
voidInit()
{system("
cls"
//清屏
\n\t************************************\n"
\tc:
CreatMaze\n"
\tm:
MazePath\n"
\tp:
PrintMaze\n"
\tq:
Quit\n"
\t***************THEMAZE***************\n"
\tChoosefromctoq:
\n\t"
voidReadCommand(char&
cmd)
{//读入操作命令符
cmd=getchar();
}while(cmd!
c'
cmd!
m'
p'
voidInterpret(charcmd){
switch(cmd){
case'
:
InitMaze(maze,a,row,col);
break;
printf("
请输入迷宫的入口位置\n"
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 课程设计 迷宫 求解