欢迎访问 生活随笔!

生活随笔

当前位置: 首页 > 编程资源 > 编程问答 >内容正文

编程问答

栈应用之简单迷宫问题(C语言版)

发布时间:2023/12/20 编程问答 39 豆豆
生活随笔 收集整理的这篇文章主要介绍了 栈应用之简单迷宫问题(C语言版) 小编觉得挺不错的,现在分享给大家,帮大家做个参考.

迷宫在这儿——–>(用二维数组实现)
栈的应用有很多,前面解决了括号问题和后缀表达式问题,迷宫便可以解决了!!
迷宫的解题思路有点绕,并且其栈的结构也有所改变!但是本次解决迷宫仍然用的普通的栈

首先:迷宫如下(1表示通路,0表示非通路)

0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 1 1 1 0 0 0 1 0 1 1 0 0 1 0 0 0

解题思路:

迷宫结构,以及位置结构

typedef struct Position //位置结构体 {int _x;int _y; }Position;#define MAX_ROW 6 #define MAX_COL 6 typedef struct Maze //迷宫结构体 {int _map[MAX_ROW][MAX_COL]; //一张地图}Maze;

一些辅助判断函数

//初始化位置 void PositionInit(Position* pos, int row, int col) {assert(pos);pos->_x = row;pos->_y = col; } //初始化迷宫 void MazeInit(Maze* m, int map[][MAX_COL]) {assert(m); //参数检测int i = 0, j = 0;for (i = 0; i < MAX_ROW; i++) //遍历赋值 {for (j = 0; j < MAX_COL; ++j){m->_map[i][j] = map[i][j];}} } //打印迷宫 void MazePrint(Maze* m, int map[][MAX_COL]) {assert(m); //参数检测int i = 0, j = 0;for (i = 0; i < MAX_ROW; ++i) //遍历打印 {for (j = 0; j < MAX_COL; ++j){printf("%d ", m->_map[i][j]);}printf("\n");} } //判断是否为合理入口 int IsValidEntry(Maze* m, Position now) {assert(m); //参数检测if (now._x == 0 || now._x == MAX_ROW - 1 || //入口合理的条件(四个)now._y == 0 || now._y == MAX_COL - 1) {if (m->_map[now._x][now._y] == 1)return 1; } return 0; } //判断是否为通路 int IsPass(Maze* m, Position next) {if (m->_map[next._x][next._y] == 1) //下一个位置元素为1,即为通路return 1;return 0; } //判断是否为出口 int IsExit(Maze* m, Position now, Position entry) {if (now._x == 0 || now._x == MAX_ROW - 1 || //入口合理的条件(四个)now._y == 0 || now._y == MAX_COL - 1 ) //出口和入口的条件一致{if (now._x != entry._x && now._y != entry._y) //出口不能和入口是同一个return 1;}return 0; }

划重点!!!—->走迷宫函数循环法

//走迷宫(循环法)(简单迷宫) void PassMaze(Maze* m, Position entry, Stack* s) {assert(m); //参数检测Position _now, _next; //创建当前位置和下一个位置if (!IsValidEntry(m, entry)) //判断入口是否合理 {printf("迷宫入口不合理!! \n");return; }StackPush(s, (entry._x * MAX_ROW) + entry._y); //入栈入口 _now = entry; while (!IsExit(m, _now, entry)) //当前步不是出口--->进入循环 {_now._x = StackTop(s) / MAX_COL; //将当前步改为栈顶位置_now._y = StackTop(s) % MAX_COL;m->_map[_now._x][_now._y] = 2;if (IsExit(m, _now, entry)) //判断是否出口return;//往上走_next = _now; //找到下一步,判断是否为通路,是则入栈,并且该位置元素改为2_next._x -= 1;if (IsPass(m, _next)){StackPush(s, (_next._x * MAX_ROW) + _next._y);m->_map[_next._x][_next._y] = 2;continue;}//往左走_next = _now;_next._y -= 1;if (IsPass(m, _next)){StackPush(s, (_next._x * MAX_ROW) + _next._y);m->_map[_next._x][_next._y] = 2;continue;}//往右走_next = _now;_next._y += 1;if (IsPass(m, _next)){StackPush(s, (_next._x * MAX_ROW) + _next._y);m->_map[_next._x][_next._y] = 2;continue;}//往下走_next = _now;_next._x += 1;if (IsPass(m, _next)){StackPush(s, (_next._x * MAX_ROW) + _next._y);m->_map[_next._x][_next._y] = 2;continue;}StackPop(s); //走到死胡同,该位置是错误的,将其出栈,并且将该位置元素改为3m->_map[_now._x][_now._y] = 3; } }

测试结果:

另外
1、该迷宫有优化之处!!今后会优化一次!!
2、其他栈应用问题,大家可以看主页!!!
3、关于栈的基础操作,附上链接:https://blog.csdn.net/code_zx/article/details/80812635
4、谢谢!!!!

总结

以上是生活随笔为你收集整理的栈应用之简单迷宫问题(C语言版)的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。