数据结构课程设计(迷宫问题)

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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]);//该点不在路径上,

相关文档
最新文档