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

来源:互联网 发布:上海招聘seo引擎优化 编辑:程序博客网 时间:2024/06/06 20:24

3.2.7 获取未走过的方向的“下一个点”

如果某些方向的“下一个点”已经走过且是“断路”,此时要取另外方向的“下一个点”进行判断。实现该功能的函数是getNext,该函数的参数是“当前站立点”,返回值是未走过的方向的“下一个点”。

MStackElem getNext(MStackElem cur) {MStackElem next;next.x = next.y = next.val = -1;if (getEast(cur).val != 0 && unPass(path, getEast(cur))) {next = getEast(cur);}else if (getSouth(cur).val != 0 && unPass(path, getSouth(cur))) {next = getSouth(cur);}else if (getWest(cur).val != 0 && unPass(path, getWest(cur))) {next = getWest(cur);}else if (getNorth(cur).val != 0 && unPass(path, getNorth(cur))) {next = getNorth(cur);}return next;}

“当前站立点”有四个方向,其中,getEast()函数获取右方的点;getSouth()获取下方的点;getWest()获取左方的点;getNorth()获取上方的点。如果四个方向的“下一个点”都已经走过,或者都是墙,则返回的点的横纵坐标和值都是-1

3.2.8 获取迷宫的路径

通过getMazePath()函数获取迷宫路径。

int getMazePath() {MStackElem start, end, cur;start.x = 0;start.y = 0;start.val = maze[start.x][start.y];end.x = 7;end.y = 7;end.val = maze[end.x][end.y]; cur = start;do{if (unPass(path, cur)) {//如果当前位置未曾走到过push(&realPath, cur);push(&path, cur);cur = getNext(cur);if (cur.x == end.x && cur.y == end.y) { //终点push(&realPath, cur);push(&path, cur);return true;}else if (cur.val == -1) {//断路pop(&realPath);cur = getTop(&realPath);//令cur指向栈顶元素}}else {//如果当前位置已经走过,说明原来测试的方向不对,现在尝试其它方向cur = getNext(cur);if (cur.val == -1) {//断路pop(&realPath);cur = getTop(&realPath);}}} while (cur.x != end.x || cur.y != end.y);}

其中,realPathpath都是“3.2.1路径的表示”中提到的路径对象;其中path表示已经在迷宫中做过的路径,包含所有走过的点,当判断当前点有没有走过时,就要使用该路径;realPath表示迷宫的有效路径,程序最后输出的是该路径中点。

3.2.9 显示迷宫路径

通过printMazePath()函数实现路径迷宫的显示,该函数的参数是迷宫的有效路径。

void printMazePath(MStack *s) {while (s->base < (s->top - 1)) {e = *(s->base); printf("(%d,%d)→", e.x + 1, e.y + 1);(s->base)++;}e = *(s->base);printf("(%d,%d)", e.x + 1, e.y + 1);}

通过while语句遍历有效路径中的所有点,并显示出来。

3.3 主函数

main()函数中的代码如下所示

initStack(&realPath);initStack(&path);getMazePath();printf("迷宫的路径是:\n\n");printMazePath(&realPath);


原创粉丝点击