数据结构集中上机实验报告

  • 格式:doc
  • 大小:305.50 KB
  • 文档页数:16

XX大学

信息与计算科学专业

2008级《数据结构》集中上机

设计题目: 迷宫求解(非递归求解)

设计时间: 2010-2011学年第一学期

姓名 班级 学号 成绩

1 目录

一、实验内容............................................................................................. 2

二、需求分析............................................................................................. 2

三、总体设计............................................................................................. 2

(一)存储结构 .................................................................................. 2

(二)流程图 ...................................................................................... 3

四、详细设计............................................................................................. 3

(一)基本算法解析 .......................................................................... 3

(二)为实现算法,需要的象的数据类型 ...................................... 4

(三)函数的调用关系 ............................................................................ 5

(四)算法时间、空间复杂度 .......................................................... 5

五、代码 ..................................................................................................... 5

六、运行结果分析 .................................................................................. 10

(一)迷宫路径探索成功 ................................................................ 10

(二)迷宫路径未找到的情况 ........................................................ 13

(三)程序的优缺点与改进 ............................................................ 13

七、参考文献........................................................................................... 14

八、心得体会........................................................................................... 14

2 一、实验内容

任务:可以输入一个任意大小的迷宫数据,用非递归的方法求出一条走出迷宫的路径,并将路径输出。

二、需求分析

1、可以输入一个任意大小的迷宫数据,用非递归的方法求出一条走出迷宫的路径,并将路径输出;要求使用非递归算法。

2、用户可以根据自己的需求进行输入所需的迷宫,其中1表示迷宫的墙壁,0表示迷宫的通路,从而建立迷宫。

3、可以自行输入迷宫的入口和出口坐标。

4、程序执行的命令包括:

(1)构造栈函数。其中包括了构造空栈InitStack;压入新数据元素Push;栈顶元素出栈Pop。

(2)构造求迷宫路径函数。其中定义了二维数组maze[M][N]存取迷宫数据;输出找到的通路MazePath。

(3)建立一个迷宫initmaze。其中包括输入迷宫行数列数以及各行各列;加一圈围墙并输出迷宫。

三、总体设计

(一)存储结构:

首先用二维数组存储迷宫数据,迷宫数据由用户输入。

一个以链表结构作存储结构的栈类型,然后编写一个求解迷宫的非递归程序。求得的通路以三元组(i,j,d)形式输出,其中(i,j)指示迷宫中的一个坐标,d表示走到下一坐标的方向(东南西北所用代表数字,自行定义)。

1.从入口出发,顺着某一个方向进行探索,若能走通,继续往前走,否则沿原路退回,换 一个方向继续探索,直至出口位置,求得一条通路。假如所有可能的通路都探索到但没能到达出口,则所设置的迷宫没有通路。

迷宫的入口点的下标(a,b),出口点的下标(m,n)。为方便,可在迷宫周围加一周障碍。对于迷宫的任意位置,均可约定有东西南北4个方向可以走通。经过的位置把0变成-1,输出迷宫路径。

2本程序有三个模块;

(1) 主程序模块

(2) 三个模块即其对象,实现栈链表抽象数据类型

(3) 迷宫存储迷宫,寻路径,输出迷宫。 3 (二)流程图

四、详细设计

(一)基本算法解析:

首先用二维数组存储迷宫数据,迷宫数据由用户输入。

一个以链表结构作存储结构的栈类型,然后编写一个求解迷宫的非递归程序。求得的通路以三元组(i,j,d)形式输出,其中(i,j)指示迷宫中的一个坐标,d表存取迷宫maze[M][N]

输入迷宫的行和列的内容

求取一条路径MazePath

迷宫无路径 显示结果

while(S1){Pop(S1,e);Push(S2,e); while(S2) { Pop(S2,e);

printf("-->(%d,%d,%d)",e.x,e.y,e.d)

END 函数Push,Pop

调用 函数MazePath,Push,Pop

调用

if(a==end.x&&b==end.y&&maze[a][b]==0)Push(S1,elem); 4 示走到下一坐标的方向(东南西北所用代表数字,自行定义)。

迷宫的过程可以模拟成一个搜索的过程。每到一处,总让它按东西南北四个方向顺序试探下一个位置,如果某方向可以通过,并且不曾到达,则前进一步,在新的位置上继续进行探索。如果4个方向都走不通或者曾经到达过,则退回一步,在原来的位置上继续试探下一位置。

每前进一步或后退一步,都要进行判断,若前进到了出口处,则说明找到了一条通路,若退回到了入口处,则说明不存在通路。

用一个二维指针数组迷宫表示迷宫,数组中每个元素取值“0”(表示通路)或“1”(表示墙壁)。迷宫的入口点在位置(a,b)处,出口点在位置(m,n)处。设计一个模拟走迷宫的算法,为期寻找一条从入口点到出口点的通路。

二维数组的0行m+1列元素全置成“1”,表示迷宫的外墙,第一行第一列元素和第m行m列元素置成“0”,表示迷宫的入口和出口。

假设当前所在位置是(x,y)。延某个方向前进一步,它可能到达的位置最多有4。

如果用结构体Element elem记录4方向上行下标增量和列下标增量,则沿第i个方向前进一步,可能到达的新位置坐标可利用结构体Element elem确定

while(!StackEmpty(S1)) //栈不为空 有路径可走

{

Pop(S1,elem);

i=elem.x;

j=elem.y;

d=elem.d+1;

从迷宫的入口位置开始,沿图示方向顺序依次进行搜索。定义一个栈,按从入口到出口存取路径,在搜索过程中,每前进一步,如果有新位置入栈,则把上一个探索的位置存入栈中,当前位置“-1”(表示这个位置在通路上),并将该位置的坐标压入栈中。

如果没有新位置入栈,则返回到上一个位置。

一直到达出口。

总之,入口出发,顺着某一个方向进行探索,若能走通,则继续往前进,否则沿着原路返回,换一个方向继续探索,直至出口位置,求得一条通路。假如所有可能的通路都探索到而未能到达出口,则所设定的迷宫没有通路。

迷宫的入口点在位置(1,1),出口点在位置(m,n)。为处理方便,可在迷宫的四周加一周障碍。对于迷宫的任一位置,均可定为东南西北四个方向可通。

(二)为实现算法,需要的象的数据类型

InitStack() 构造空栈

StackEmpty() 判断栈是否为空

Push() 压入新数据元素

Pop() 栈顶元素出栈

m 迷宫的行数

n 迷宫的列数

d 0=东 1=南 2=西 3=北 5 typedef struct Lstack

{

Element elem; 链栈

struct LStack *next;

}*PLStack;

(三)函数的调用关系

main

initmaze mazePath

InitStack Push Pop

(四)算法时间、空间复杂度

1)本算法在空间上主要开辟了一个二维数组,规模都是迷宫(m+2)*(n+2)。一个是栈,一个是迷宫路径记录,输入时候调用栈。

2)在时间上为简单的链表栈的存储结构,二维指针initmaze函数算法时间复杂度为O((m+2)*(n+2)),Mazepath为O(1),(m为行数n为列数)。

五、代码

/*以一个m*n的长方阵表示迷宫,0和1分别表示迷宫中的通路和障碍,设计一个程序对任意设定的迷宫,求出一条从入口到出口的通路,或得出没有通路的结论。

首先实现一个以链表结构作存储结构的栈类型,然后编写一个求解迷宫的非递归程序。求得的通路以三元组(i,j,d)形式输出,其中(i,j)指示迷宫中的一个坐标,d表示走到下一坐标的方向。*/

#include

#include

#define M 15

#define N 15