数据结构课程设计(迷宫问题)
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
大连海洋大学理学院
课程设计实验报告
迷宫问题程序的设计与实现
一、需求分析
1、问题描述:本实验是迷宫问题,取自心理学的一个古典实验。在该实验中,把一只老鼠从一个无顶大盒子的门放入,在盒中设置了许多墙,对行进方向形成了多处阻挡。盒子仅有一个出口,在出口处放置一块奶酪,吸引老鼠在迷宫中寻找道路以到达出口。对同一老鼠重复进行上述实验,一直到老鼠从入口到出口,而不走错一步。老鼠经多次试验终于得到它学习走该迷宫的路线。设计一个计算机程序对任意设定的迷宫,求出一条从入口到出口的通路,或得出没有通路的结论。
2、基本要求:
(1)一条通路的二元组(i,j)数据序列,(i,j)表示通路上某一点的坐标。
(2)用标志(如数字8)在二维数组中标出该条通路,并在屏幕上输出二维数组。
3、实现提示:
(1)以二维数组maze[i][j]表示迷宫,其中0m
i≤
≤,0n
≤,
j≤数组元素值为1表示该位置是墙壁,不能通行;元素值为0
表示该位置是通路。限定迷宫的大小m=n=9。假定从mg[0][0]
出发,出口位于mg[m][n],移动方向为顺时针的8个方向
(东,东南,南,西南,西,西北,北,东北)。
(2)以文件的形式输入迷宫的数据:文件中第一行的数据为迷宫
的行数m和列数n,从第2行至第m+1行为迷宫值;
(3)若设定的迷宫存在通路,则以方阵形式及其通路路径输出,若设定的迷宫不存在通路,则输出“没有可走路径”
(4)用一种标志(本题设为8)在二维数组中显示该条通路,并在屏幕上输出二维数组,本程序最终要求求出一条成功的通
路
二、概要设计
2.1 类型的定义:
typedef struct
{
int row;//行
int col;//列
int dir;//方向
}element;
element stack[MAX_STACK_SIZE];//存储走过的位置
typedef struct
{
int vert;水平方向增量
int horiz;垂直方向增量
}offsets; //记录八个方向(东,东南,南,西南,西,西北,北,东北)
int maze[N+2][N+2]; //迷宫
int mark[N+2][N+2]; //记录maze数组上的元素是否别访问过int EXIT_ROW,EXIT_COL;//定义找到出口时的行和列
2.2 关系:
下图为path()函数的流程图
三、详细设计
void path()
{int row,col,next_row,next_col,dir,found=FALSE;
//分别为:当前位置行、列号,下一位置行、列号,遍历方向
element position;
int top=0;
mark[1][1]=1; //标记初始位置
stack[0].row=1; //初始位置行号
stack[0].col=1; //初始位置列号
stack[0].dir=0; //定义初始位置遍历方向
move[0].vert=1;move[0].horiz=1;//八个方向具体设置
move[1].vert=0;move[1].horiz=1;
move[2].vert=1;move[2].horiz=0;
move[3].vert=-1;move[3].horiz=1;
move[4].vert=1;move[4].horiz=-1;
move[5].vert=-1;move[5].horiz=0;
move[6].vert=0;move[6].horiz=-1;
move[7].vert=-1;move[7].horiz=-1;
while (栈不为空且没找到路径)
{position =del(&top); //栈顶元素出栈
//将出栈元素作为当前位置row=position.row;
col=position.col;
dir=position.dir;
while(八个方向没走完且没找到出路)
{
next_row=row+move[dir].vert; //下一位置行号
next_col=col+move[dir].horiz; //下一位置列号
if(下一位置为终点)
{found=TRUE;
当前位置入栈;
终点入栈;
}
else if(下一位置非墙且没走过)//
{
标记“下一位置;”
“当前位置”入栈;
“当前位置”改为“下一位置”
初始方向设为第一方向即(dir=0)
}
else 遍历下一方向即(dir++)
}
if(found)//
{
int count=0; //记录节点为输出路径上的第几个节点
输出:找到路径!!路径坐标如下:
for(int i=0;i<=top;i++)
{
count++;//计数
输出该节点坐标;
if(count%5==0)printf("\n");
}
printf("\n\n\n");
int flag; //记录最后遍历方向的下一方向
printf("具体路径为:\n");
for(i=1;i { for(int j=1;j { flag=-1; //初值 if(栈中有该点坐标)flag=1; if(flag==-1)printf("%2d",maze[i][j]);//该点不在路径上,