C++迷宫问题实验报告

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

数据结构集中上机

试验报告

班级:031021 学号:03102017 姓名:燕文静

题目:编制一个求解迷宫通路的程序

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

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

实验过程:

1.基本算法以及分析:

本程序主要是以链表构造栈的形式,寻找迷宫路径,根据创立的结点,输入结点里的一些数据,如下

struct Stack //构造栈

{

int Maze_x,Maze_y; //定义迷宫X,Y坐标

Stack * next; //定义栈指针

};

程序由主函数开始,首先,定义一个二维数组迷宫。选择开始坐标点,然后,开始入栈,利用各个位置的判断循环建立结点,记录各个位置的数据,若走进死胡同则退栈,并且判断是否栈空,找到路径并到达出口后将栈倒置,使其按从入口到出口的顺序输出,之后调用迷宫图案输出函数,使其按要求输出。

二.概要设计

1. 抽象数据类型定义为:

ADT stack{

数据对象:D={ai|ai∈LinkList, i=1,2,...n, n≥0}

数据关系:R1={|ai-1,ai∈D|=2,……n },即当前结点与下一个结点的关系

基本操作:

stack();

构造函数,建立一个空栈;

操作结果:通过字符串a构造两个位数不限的长整数。

void Push(DataType data);

初始条件:已存在栈

操作结果:把元素data压入栈顶

DataType Pop();

初始条件:已存在栈,且非空

操作结果:栈顶元素出栈,且删除栈顶元素

DataType GetPop();

初始条件:已存在栈,且非空

操作结果:获取栈顶元素

void Clear();

初始条件:已存在栈

操作结果:把当前的栈清空

bool IsEmpty();

初始条件:已存在栈

操作结果:如果栈为空,则结果为“真”,否则为“假”

}ADT OrderedList

2.程序源代码:

#include

#include

using namespace std;

struct Stack //构造栈

{

int Maze_x,Maze_y,Maze_z; //定义迷宫X,Y坐标,z方向

Stack * next; //定义栈指针

};

Stack *ps; //链头指针

void Pop() //出栈函数

{

Stack *p;

p = ps;

ps=ps->next;

delete p;

}

void push(int x,int y,int z) //进栈函数

{

Stack *t;

t = new Stack;

t->Maze_x = x;

t->Maze_y = y;

t->Maze_z = z;

t->next = ps;

ps = t;

}

void Mazepath(int a[][10],int i,int j) //迷宫路线寻找函数

{

a[i][j]=2;

int c,d,m=1; //定义变量c,d为出口坐标,变量m作为走过的步数

cout<<"请输入出口坐标:";

cin>>c>>d;

while(i!=c || j!=d) //判断是否到达出口

{

if(a[i][j+1]==0) //判断右边是否可行

{

push(i,j,1);

j++;

a[i][j] = 2; //标记走过的位置

}

else if(a[i+1][j]==0) //判断下边是否可行

{

push(i,j,2);

i++;

a[i][j] = 2; //标记走过的位置

}

else if(a[i][j-1]==0) //判断左边是否可行

{

push(i,j,3);

j--;

a[i][j] = 2; //标记走过的位置

}

else if(a[i-1][j]==0) //判断上边是否可行

{

push(i,j,4);

i--;

a[i][j] = 2; //标记走过的位置

}

else //四个方向都不可行,退栈

{

int e1,e2;

Stack *p;

p = ps;

ps=ps->next;

e1=p->Maze_x;

e2=p->Maze_y;

a[e1][e2]=3; //标记走过的死胡同坐标

delete p; //删除栈顶元素

i = ps->Maze_x;

j = ps->Maze_y;

if(ps==NULL) //判断栈空否

{

cout<<"no path!"<

exit(1);

}

}

}

Stack *pk = new Stack;

pk->next = NULL;

while(ps!=NULL) //倒置栈中的数据,使其从开始坐标输出

{

Stack *t;

t = ps;

ps = ps->next;

t->next = pk->next;

pk->next = t;

}

Stack *k=pk;

pk = pk->next;

delete(k); //释放PK空间

while(pk!=NULL) //输出走过的坐标

{

cout<<"("<Maze_x<<","<Maze_y<<","<Maze_z<<")"<

Stack *k = pk;

pk = pk->next;

delete k;

}

相关文档
最新文档