数据结构迷宫问题实验报告Word文档下载推荐.doc

上传人:b****1 文档编号:13169088 上传时间:2022-10-07 格式:DOC 页数:15 大小:223.50KB
下载 相关 举报
数据结构迷宫问题实验报告Word文档下载推荐.doc_第1页
第1页 / 共15页
数据结构迷宫问题实验报告Word文档下载推荐.doc_第2页
第2页 / 共15页
数据结构迷宫问题实验报告Word文档下载推荐.doc_第3页
第3页 / 共15页
数据结构迷宫问题实验报告Word文档下载推荐.doc_第4页
第4页 / 共15页
数据结构迷宫问题实验报告Word文档下载推荐.doc_第5页
第5页 / 共15页
点击查看更多>>
下载资源
资源描述

数据结构迷宫问题实验报告Word文档下载推荐.doc

《数据结构迷宫问题实验报告Word文档下载推荐.doc》由会员分享,可在线阅读,更多相关《数据结构迷宫问题实验报告Word文档下载推荐.doc(15页珍藏版)》请在冰豆网上搜索。

数据结构迷宫问题实验报告Word文档下载推荐.doc

数据对象:

D={ai|ai属于CharSet,i=1、2…n,n>

=0}

数据关系:

R={<

ai-1,ai>

|ai-1,ai属于D,i=2,3,…n}

基本操作:

InitStack(&

S)

操作结果:

构造一个空栈

Push(&

S,e)

初始条件:

栈已经存在

将e所指向的数据加入到栈s中

Pop(&

S,&

e)

若栈不为空,用e返回栈顶元素,并删除栈顶元素

Getpop(&

S,&

若栈不为空,用e返回栈顶元

StackEmpty(&

判断栈是否为空。

若栈为空,返回1,否则返回0

Destroy(&

销毁栈s

}ADTStack

(2)设定迷宫的抽象数据类型定义

ADTyanshu{

D={ai,j|ai,j属于{‘’、‘*’、‘@’、‘#’},0<

=i<

=M,0<

=j<

=N}

R={ROW,COL}

ROW={<

ai-1,j,ai,j>

|ai-1,j,ai,j属于D,i=1,2,…M,j=0,1,…N}

COL={<

ai,j-1,ai,j>

|ai,j-1,ai,j属于D,i=0,1,…M,j=1,2,…N}

InitMaze(MazeType&

maze,inta[][COL],introw,intcol){

二维数组inta[][COL],已经存在,其中第1至第m-1行,每行自第1到第n-1列的元素已经值,并以值0表示障碍,值1表示通路。

构造迷宫的整形数组,以空白表示通路,字符‘0’表示障碍

在迷宫四周加上一圈障碍

MazePath(&

maze){

迷宫maze已被赋值

若迷宫maze中存在一条通路,则按如下规定改变maze的状态;

以字符‘*’表示路径上的位置。

字符‘@’表示‘死胡同’;

否则迷宫的状态不变

}

PrintMaze(M){

迷宫M已存在

以字符形式输出迷宫

}ADTmaze

(3)本程序包括三个模块

a、 

主程序模块

voidmain()

{

初始化;

构造迷宫;

迷宫求解;

迷宫输出;

b、 

栈模块——实现栈的抽象数据类型

c、 

迷宫模块——实现迷宫的抽象数据类型

2、详细设计

(1)坐标位置类型:

typedefstruct{

introw;

//迷宫中的行

intcol;

//......的列

}PosType;

//坐标 

(2) 

迷宫类型:

typedefstruct{

intm,n;

intarr[RANGE][RANGE];

}MazeType;

//迷宫类型

void 

maze,inta[][COL],introw,intcol)\

//设置迷宫的初值,包括边缘一圈的值

BoolMazePath(MazeType&

maze,PosTypestart,PosTypeend)

//求解迷宫maze中,从入口start到出口end的一条路径

//若存在,则返回true,否则返回false

VoidPrintMaze(MazeTypemaze)

//将迷宫打印出来

(3) 

栈类型:

int 

step;

//当前位置在路径上的"

序号"

PosType 

seat;

//当前的坐标位置

DirectiveType 

di;

//往下一个坐标位置的方向

}SElemType;

//栈的元素类型

SElemType*base;

SElemType*top;

intstacksize;

}SqStack;

栈的基本操作设置如下:

VoidInitStack(SqStack&

S)

//初始化,设S为空栈(S.top=NUL)

VoidDestroyStack(Stack&

//销毁栈S,并释放空间

VoidClearStack(SqStack&

//将栈S清空

IntStackLength(SqStack&

//返回栈S的长度

StatusStackEmpty(SqStack&

、若S为空栈(S.top==NULL),则返回TRUE,否则返回FALSE

StatueGetTop(SqStack&

S,SElemTypee)

//r若栈S不空,则以e待会栈顶元素并返回TRUE,否则返回FALSE

StatuePop(SqStack&

//若分配空间成功,则在S的栈顶插入新的栈顶元素s并返回TRUE

//否则栈不变,并返回FALSE

StatuePush(SqStack&

S,SElemType&

//若分配空间程控,则删除栈顶并以e带回其值,则返回TRUE

//否则返回FALSE

VoidStackTraverse(SqStack&

S,Status)(*Visit)(SElemTypee))

//从栈顶依次对S中的每个节点调用函数Visit

4求迷宫路径的伪码算法:

StatusMazePath(MazeType&

maze,PosTypestart,PosTypeend){//求解迷宫maze中,从入口start到出口end的一条路径

InitStack(s);

PosTypecurpos=start;

intcurstep=1;

//探索第一部

do{

if(Pass(maze,curpos)){ 

//如果当前位置可以通过,即是未曾走到的通道块

FootPrint(maze,curpos);

//留下足迹

e=CreateSElem(curstep,curpos,1);

//创建元素

Push(s,e);

if(PosEquare(curpos,end)) 

returnTRUE;

curpos=NextPos(curpos,1);

//获得下一节点:

当前位置的东邻

curstep++;

//探索下一步

}else{ 

//当前位置不能通过

if(!

StackEmpty(s)){

Pop(s,e);

while(e.di==4&

&

!

StackEmpty(s)){

MarkPrint(maze,e.seat);

Pop(s,e);

//留下不能通过的标记,并退回步

if(e.di<

4){

e.di++;

Push(s,e);

//换一个方向探索

curpos=NextPos(e.seat,e.di);

//设定当前位置是该方向上的相块

}//if

}//else

}while(!

StackEmpty(s));

returnFALSE;

//MazePath

四、程序调试分析

1.首先呢,想自己读入数据的,回来发现那样,很麻烦,所以还是事先定义一个迷宫。

2.栈的元素类型一开始有点迷惑,后来就解决了

3.本题中三个主要算法;

InitMaze,MazePath和PrintMaze的时间复杂度均为O(m*n)本题的空间复杂度也是O(m*n)

五、用户使用说明

1.本程序运行在windows系列的操作系统下,执行文件为:

Maze_Test.exe。

六、程序运行结果

1.建立迷宫:

2.通过1功能建立8*8的迷宫后,通过2功能继续建立迷宫内部:

通过建立自己设定单元数目建立迷宫内墙。

3.通过3功能观察已建立的迷宫结构:

4.通过4功能确立迷宫起点和终点:

(此处像我们随机选择4,4和2,7分别为起点终点)

5.执行5功能,判断是否有路径走出迷宫:

这种情况无法走出迷宫。

我们再次观察图像设4,4和1,6分别为起点终点,再运行5功能。

观察到可以成功解开迷宫步数从1依次开始。

七、程序清单

#include<

stdio.h>

stdlib.h>

string.h>

malloc.h>

//迷宫坐标位置类型

typedefstruct

intx;

//行值

inty;

//列值

#defineMAXLENGTH25//设迷宫的最大行列为25

typedefintMazeType[MAXLENGTH][MAXLENGTH];

//迷宫数组[行][列]

typedefstruct//栈的元素类型

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 考试认证 > IT认证

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1