数据结构课程设计迷宫问题Word文档格式.docx
- 文档编号:13719088
- 上传时间:2022-10-13
- 格式:DOCX
- 页数:19
- 大小:184.37KB
数据结构课程设计迷宫问题Word文档格式.docx
《数据结构课程设计迷宫问题Word文档格式.docx》由会员分享,可在线阅读,更多相关《数据结构课程设计迷宫问题Word文档格式.docx(19页珍藏版)》请在冰豆网上搜索。
八、参考文献…………………………………………15
九、附录………………………………………………16
迷宫问题
一、需求分析:
1、以一个m*m的方阵表示迷宫,0和1分别表示迷宫中的通路和障碍。
设计一个程序,对任意设定的迷宫,求出一条从入口到出口的通道,或得出没有通路的结论。
2、用户需用文件的形式输入迷宫的数据:
文件中第一行的数据为迷宫的行数m和列数n;
下面用0,1输入整个迷宫,每两个数字之间需加一个空格。
3、程序执行的命令为:
1,创建迷宫;
2,求解迷宫;
3,输出迷宫的解。
二、概要设计:
1、设定栈的抽象数据类型定义
ADTStack{
数据对象:
D={ai|ai∈CharSet,i=1,2…n,n>
=0}
数据关系:
R1={<
ai-1,ai>
|ai-1,ai∈D,i=2,…n}
基本操作:
InitStack(&
S)
操作结果:
构造一个空栈S。
DestroyStack(&
初始条件:
栈S已存在。
销毁栈S。
ClearStack(&
将S清为空栈。
StackLength(S)
返回栈S的长度。
StackEmpty(S)
若S为空栈,则返回TRUE,否则返回FALSE。
GetTop(S,&
e)
若栈S不空,则以e返回栈顶元素。
Push(&
S,e)
在栈S的栈顶插入新的栈顶元素e。
Pop(&
S,&
删除S的栈顶元素,并以e返回其值。
StackTraverse(S,visit())
从栈底到栈顶依次对S中的每个元素调用函数visit()。
}ADTStack
2、设定迷宫的抽象数据类型
ADTmaze{
{ai,j|ai,j∈{'
'
‘0’,‘1’},0<
=i<
=m+1,0<
=j<
=n+1,m,n<
=15}
R={ROW,COL}
InitMaze(&
M,a,row,col)
二维数组a[row+2][col+2]已存在,其中自第1行至第row+1行,每行中自第1列至第col+1列的元素已有值,并且以值0表示通路,以值1表示障碍。
操作结果:
构成迷宫的字符型数组,以空白字符表示通路,以字符‘1’表示障碍,并在迷宫四周加上一圈障碍。
MazePath(&
M)
迷宫M已被赋值。
若迷宫M中存在一条通路,则按以下规定改变迷宫M的状态:
以字符’0’表示路径上的位置,字符‘1’表示“死胡同”,否则迷宫的状态不变。
PrintMaze(M)
迷宫M已存在。
以字符形式输出迷宫。
}ADTmaze
3、本程序包含三个模块
(1)栈模块——实现栈抽象数据类型
(2)迷宫模块——实现迷宫抽象数据类型
(3)主程序模块:
voidmian()
{
}
4、各模块之间的调用关系
主模块程序→迷宫模块→栈模块
三、详细设计:
迷宫问题算法设计:
走迷宫的过程可以模拟为一个搜索的过程:
每到一处,总让它按东、东南、南、西南、西、西北、北、东北个方向顺序试探下一个位置;
如果某方向可以通过,并且不曾到达,则前进一步,在新位置上继续进行搜索;
如果个方向都走不通或曾经到达过,则退回一步,在原来的位置上继续试探下一位置。
每前进或后退一步,都要进行判断:
若前进到了出口处,则说明找到了一条通路;
若退回到了入口处,则说明不存在通路。
用一个字符类型的二维数组表示迷宫,数组中每个元素取值“0”(表示通路)或“1”(表示墙壁)。
迷宫的入口点在位置(1,1)处,出口点在位置(m,m)处。
这个算法,为其寻找一条从入口点到出口点的通路。
坐标位置类型
structmark//定义迷宫内点的坐标类型
{
intx;
inty;
};
栈类型
structElement
intx,y;
//x行,y列
intd;
//d下一步的方向
typedefstructLStack//链栈
Elementelem;
structLStack*next;
}*PLStack;
栈的基本操作设置
intInitStack(PLStack&
S)//构造空栈
S=NULL;
return1;
}
intStackEmpty(PLStackS)//判断栈是否为空
if(S==NULL)
else
return0;
intPush(PLStack&
S,Elemente)//压入新数据元素
PLStackp;
p=(PLStack)malloc(sizeof(LStack));
p->
elem=e;
next=S;
S=p;
intPop(PLStack&
S,Element&
e)//栈顶元素出栈
if(!
StackEmpty(S))
e=S->
elem;
p=S;
S=S->
next;
free(p);
求解迷宫路径的函数算法
voidMazePath(structmarkstart,structmarkend,intmaze[M][N],intdiradd[4][2])
inti,j,d;
inta,b;
Elementelem,e;
PLStackS1,S2;
InitStack(S1);
InitStack(S2);
maze[start.x][start.y]=2;
//入口点作上标记
elem.x=start.x;
elem.y=start.y;
elem.d=-1;
//开始为-1
Push(S1,elem);
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(a==end.x&
&
b==end.y&
maze[a][b]==0)//如果到了出口
elem.x=i;
elem.y=j;
elem.d=d;
elem.x=a;
elem.y=b;
elem.d=4;
//方向输出为-1判断是否到了出口
printf("
\n0=东1=南2=西3=北4为走出迷宫\n\n通路为:
(行坐标,列坐标,方向)\n"
);
while(S1)//逆置序列并输出迷宫路径序列
Pop(S1,e);
Push(S2,e);
while(S2)
Pop(S2,e);
-->
(%d,%d,%d)"
e.x,e.y,e.d);
}return;
if(maze[a][b]==0)//找到可以前进的非出口的点
maze[a][b]=2;
//标记走过此点
//当前位置入栈
i=a;
//下一点转化为当前点
j=b;
d=-1;
d++;
没有找到可以走出此迷宫的路径\n"
创建迷宫
voidinitmaze(intmaze[M][N])
inti,j;
intm,n;
//迷宫行,列[/M]
请输入迷宫的行数m="
scanf("
%d"
&
m);
请输入迷宫的列数n="
n);
\n请输入迷宫的各行各列的数据:
\n数据用空格隔开,0代表通路,1代表墙\n"
m,n);
for(i=1;
i<
=m;
i++)
for(j=1;
j<
=n;
j++)
maze[i][j]);
您创建的迷宫为(最外圈的1为墙)...\n"
for(i=0;
=m+1;
i++)//加一圈围墙
maze[i][0]=1;
maze[i][n+1]=1;
for(j=0;
=n+1;
maze[0][j]=1;
maze[m+1][j]=1;
i++)//输出迷宫
%d"
maze[i][j]);
\n"
主函数
voidmain()
intsto[M][N];
structmarkstart,end;
//start,end入口和出口的坐标
intadd[4][2]={{0,1},{1,0},{0,-1},{-1,0}};
//行增量和列增量方向依次为东西南北[/M]
initmaze(sto);
//建立迷宫
请输入入口的横坐标,纵坐标[逗号隔开]\n"
%d,%d"
start.x,&
start.y);
请输入出口的横坐标,纵坐标[逗号隔开]\n"
end.x,&
end.y);
MazePath(start,end,sto,add);
//找到路径
system("
PAUSE"
}
四、设计和调试分析
1、本次作业比较简单,只有一个核心算法,
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 课程设计 迷宫 问题