C++基于控制台的迷宫实现(中)

来源:互联网 发布:mac卸载office 编辑:程序博客网 时间:2024/06/05 13:30

3.2 迷宫的操作

3.2.1 路径的表示

路径是由许多点组成的。因此表示路径的struct中包含了起始点的指针和终止点的指针,以及该路径中包含点的最大值。

typedef struct {MStackElem * base;MStackElem * top;int stackSize;}MStack;

3.2.2 路径的初始化

对路径的初始化实际上就是为路径中的所有点分配空间。

void initStack(MStack *s) {s->base = (MStackElem *)malloc(STACK_INIT_SIZE * sizeof(MStackElem));if (!s->base) {printf("in initStack()...Failed to initalize the MStack ,no enough space! exit now. ");exit(OVERFLOW);//存储分配失败}s->top = s->base;s->stackSize = STACK_INIT_SIZE;}

其中,malloc()函数的作用是在内存中分配空间,分配的空间大小为STACK_INIT_SIZE*sizeof(MStackElem)字节;STACK_INIT_SIZE表示路径中包含的点的个数,其定义为

#define STACK_INIT_SIZE 100

3.2.3 向路径中添加点

如果当前点是“通路”,则需要将当前点添加到路径中。push()函数完成向路径中添加点的功能,该函数的第一个参数表示路径,第二个参数表示要添加的点。

void push(MStack *s, MStackElem e) {if (s->top - s->base >= s->stackSize) {s->base = (MStackElem *)realloc(s->base, (STACK_INIT_SIZE + STACKINCREMENT) * sizeof(MStackElem));if (!s->base) {printf("in push()...Failed to realloc the MStack ,no enough space! exit now. ");exit(OVERFLOW);}s->top = s->base + s->stackSize;s->stackSize += STACKINCREMENT;}*(s->top++) = e;}
当向路径中添加点时,首先判断该路径中的点是不是已经满了;如果满了,则需要为路径“扩容”,即通过realloc()函数实现,路径扩容之后,相应的终止点的位置和点的数量会发生变化;STACKINCREMENT表示路径每次扩容的大小,其值定义为

#define STACKINCREMENT 10

当将点添加到路径后,终止点的位置和值都要发生变化。

3.2.4 从路径中删除点

如果当前点是“断路”,则需要从路径中删除点,即将路径中终止点向起始点的方向移动一位。pop()函数完成从指定的路径上删除点的功能,该函数的参数为路径。

void pop(MStack *s) {if (s->top == s->base) {printf("in pop(),empty stack! exit now. ");exit(ERROR);}else {--(s->top);}}

在路径中删除点时,首先判断路径是否已经是空的,如果不为空,则移动路径中的终止点。

3.2.5 获取路径中的终止点

如果当前点是“断路”,则需要返回该点的“上一个点”,对“上一个点”进行判断。获取“上一个点”的函数是getTop(),该函数的参数是指定的路径。

MStackElem getTop(MStack *s) {if (s->top == s->base) {printf("in getTop(),empty stack! exit now. ");exit(ERROR);}else {return *(s->top - 1);}}

3.2.6 判断当前点是否已经走过

判断当前点是否已经走过,如果没有走过,则需要判断该点是否是“通路”、“断路”和“终点”;如果该点已经走过,则说明该点是“通路”,某些方向的“下一个点”已经走过且是“断路”,此时要取另外方向的“下一个点”进行判断。

判断当前点是否已经走过的函数是unPass(),该函数第一个参数是指定路径,第二个参数是要判断的点。

int unPass(MStack path, MStackElem cur) {int flag = 1;while (path.top != path.base){MStackElem e = *(path.top - 1);if (e.x == cur.x&& e.y == cur.y){flag = 0;}(path.top)--;}return flag;}

使用while循环遍历路径中的所有点,如果在路径中发现指定的点,则说明该点已经走过,函数的返回值是0,否则为没有走过该点,返回值是1

原创粉丝点击