数据结构(C语言版)实验报告(迷宫) 下载本文

《数据结构与算法》实验报告

评分依据及结果

态度(A-D) 评语

规范性(A-D) 完成度(A-D) 总评(A-D) 一、 需求分析

1.问题描述:

以一个m*n的长方阵表示迷宫,空格和感叹号分别表示迷宫中的通路和障碍。设计一个程序,对随机产生的迷宫,求一条从入口到出口的通路,或得出没有通路的结论。

2.基本要求

首先实现一个以链表为存储结构的栈类型,然后编写一个求解迷宫的非递归程序。求得的通路以三元组(i,j,d)的形式输出。

其中(i,j)表示迷宫的一个坐标,d表示走到下一座标的方向。 3.程序的执行命令有:

1)输入迷宫的列数2)输入迷宫的行数

二、 概要设计

为实现上述功能,需要以一个链表为存储结构的栈类型 1. 栈的顺序存储表示

typedef struct {

int x; /*列*/ int y; /*行*/

}PosType; //坐标位置类型 typedef struct {

int ord; //通道块在路径上的\序号\

PosType seat; //通道块在迷宫中的\坐标位置\ int di; //从此通道块走向下一通道块的\方向\ }SElemType; //栈的元素类型 typedef struct {

SElemType *base; SElemType *top;

int stacksize; //当前已分配的存储空间,以元素为单位 } SqStack;

//迷宫程序 typedef struct { int lie; /*列数*/ int hang; /*行数*/ char a[999][999]; }

MazeType; /*迷宫类型*/ 2.

基本操作

int InitStack(SqStack *S)//分配空间

int GetTop(SqStack *S,SElemType *e)//若栈不空,则用e返回S的栈顶元素,并返回OK;否则返

回ERROR

int Push(SqStack *S,SElemType *e)//插入元素e作为新的栈顶元素

int Pop(SqStack *S,SElemType *e) //若栈不空,则删除S的栈顶元素,用e返回其值,并返回OK;

否则返回ERROR

int generatemaze( MazeType *maze)//随机生成迷宫

int Pass(MazeType *maze, PosType curpos ) //判断当前位置可否通过 int FootPrint(MazeType *maze,PosType curpos) //留下足迹

int MarkPrint(MazeType *maze,PosType curpos) //留下不能通过的标记 PosType NextPos(PosType curpos,int di) //返回当前位置的下一位置

int MazePath(MazeType *maze,PosType start,PosType end)//若迷宫有解,则求得一条存放在栈中

(从栈底到栈顶),并返回OK,否则返回ERROR

void PrintMaze(MazeType *maze)

三、 详细设计

//程序的头文件

#include #include #include #include #include

//函数的返回值

#define OK 1 #define ERROR 0 #define NULL 0

#define OVERFLOW -2 #define STACK_INIT_SIZE 100 #define STACKINCREMENT 10 //栈的顺序存储表示 typedef struct {

int x; /*列*/ int y; /*行*/

}PosType; //坐标位置类型 typedef struct { int ord; //通道块在路径上的\序号\ PosType seat; //通道块在迷宫中的\坐标位置\ int di; //从此通道块走向下一通道块的\方向\}SElemType; //栈的元素类型 typedef struct { SElemType *base;

//打印迷宫

SElemType *top;

int stacksize; //当前已分配的存储空间,以元素为单位 }

SqStack;

//基本操作

int InitStack(SqStack *S) { S->base=(SElemType *)malloc(STACK_INIT_SIZE * sizeof(SElemType)); if(!S->base) exit(OVERFLOW); S->top=S->base; S->stacksize=STACK_INIT_SIZE; return OK; }

//若栈不空,则用e返回S的栈顶元素,并返回OK;否则返回ERROR int GetTop(SqStack *S,SElemType *e) { if(S->top==S->base) return ERROR; *e=*(S->top-1); return OK; }

int Push(SqStack *S,SElemType *e)//插入元素e作为新的栈顶元素 {

if(S->top-S->base>=S->stacksize)/*栈满,追加存储空间*/ { S->base=(SElemType*)realloc(S->base,(S->stacksize+STACKINCREMENT)*sizeof(SElemType)); if(!S->base) exit(OVERFLOW); S->top=S->base+S->stacksize; S->stacksize+=STACKINCREMENT; } *S->top++=*e; return OK; }

//若栈不空,则删除S的栈顶元素,用e返回其值,并返回OK;否则返回ERROR int Pop(SqStack *S,SElemType *e) { if(S->top==S->base) return ERROR; *e=*--S->top; return OK; }

int StackEmpty(SqStack *S)

{ return(S->top==S->base) ;}

//迷宫程序 typedef struct { int lie; /*列数*/ int hang; /*行数*/ char a[999][999]; }

MazeType; /*迷宫类型*/ /*随机生成迷宫*/

int generatemaze( MazeType *maze) { int i,j; maze->a[0][0]=2;

maze->a[++maze->hang][++maze->lie]=3; /*设置外墙*/ maze->a[0][maze->lie]='!'; maze->a[maze->hang][0]='!'; for(j=1;jlie;j++) { maze->a[0][j]='!'; maze->a[maze->hang][j]='!'; } for(i=1;ihang;i++) { maze->a[i][0]='!'; maze->a[i][maze->lie]='!'; } srand((unsigned)time( NULL )); rand(); for(i=1; i hang; i++) for(j=1;jlie;j++) { if (rand()>=RAND_MAX/4) maze->a[i][j] =' '; //' ' 暗示出路 else maze->a[i][j] ='!'; //'!'暗示无出路 } return OK; }

int Pass(MazeType *maze, PosType curpos ) //判断当前位置可否通过 { if ((curpos.x < 1) || (curpos.x >= maze->lie)) return ERROR; if ((curpos.y < 1) || (curpos.y >= maze->hang))