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。
阅读全文
0 0
- C++基于控制台的迷宫实现(中)
- C++基于控制台的迷宫实现(上)
- C++基于控制台的迷宫实现(下)
- 迷宫的实现--c语言
- 基于Win32控制台的万年历的实现(上)
- 基于Win32控制台的万年历的实现(下)
- 基于sqlite3实现的简单通讯录程序(控制台)
- 基于sqlite3实现的简单通讯录程序(控制台)
- 迷宫求解问题的简易实现(C++)
- 栈的引用--迷宫算法(c语言实现)
- 求win32下的多线程控制台程序(c实现)
- 迷宫算法(c语言实现)
- 堆栈实现迷宫出路(C语言)
- C语言 迷宫(栈实现)
- 迷宫问题 C语言实现(深搜)
- 迷宫C实现
- 迷宫的实现——基于栈知识
- 将C基于控制台的可执行程序右上角的红叉禁掉
- HDU 6085 Rikka with Candies
- 下面这条语句一共创建了多少个对象:String bb="aa"+"bb"+"cc"+"dd"
- hibernate 里面list集合,返回多个null
- Android Studio配置kotlin
- 剑指offer题目分类
- C++基于控制台的迷宫实现(中)
- request中getParameter(),getAttribute()区别
- Hive 之 join大全
- centos7下面yum安装软件报错,显示找不到镜像地址。
- android 运行jar
- 敏捷开发模式的修炼之道
- 1071. Speech Patterns (25)
- maven下的ssm框架的简单构建
- HDU-6055 Regular polygon