《数据结构与算法》实验报告
评分依据及结果
态度(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
//函数的返回值
#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;j
int Pass(MazeType *maze, PosType curpos ) //判断当前位置可否通过 { if ((curpos.x < 1) || (curpos.x >= maze->lie)) return ERROR; if ((curpos.y < 1) || (curpos.y >= maze->hang))