#include <iostream>#include <stack>#include <vector>//全局声明int nums[10][10];
- 初始化迷宫 。为了简化问题,会把二维数组的第一行和最后一行,第一列和最一列中的所有单元格赋值 1,表示墙面 。
文章插图
//全局声明int nums[10][10]= {{1,1,1,1,1,1,1,1,1,1},{1,0,0,1,0,1,1,1,1,1},{1,1,0,1,0,0,1,1,1,1},{1,1,0,1,0,0,0,0,1,1},{1,1,0,0,0,0,1,0,1,1},{1,1,1,1,0,0,1,0,1,1},{1,1,0,0,0,0,1,0,1,1},{1,1,1,1,0,0,1,0,1,1},{1,1,0,0,0,1,1,0,0,1},{1,1,1,1,1,1,1,1,1,1}, };对于二维数组中的任一位置有左、下、右、上 4 个方向,当前位置的坐标与 4个方位的坐标关系如下图所示:
文章插图
这里定义一个方向结构体,用来存储 4 个方位的增量信息,便于计算 。
//方向struct Direction{ //x 方向增量 int xOffset; //y 方向增量 int yOffset;};并且创建 Direction类型数组,用于保存 4 个方向的增量信息 。
//全局声明Direction dirs[4]={ {0,1},{1,0},{0,-1},{-1,0} };方向信息,为快速找到当前位置周边的坐标提供了便利 。为了存储坐标,这里需要一个坐标结构体:
struct Position { //x坐标 int x; //y坐标 int y; //无参构造 Position() { } //有参构造 Position(int x,int y) {this->x=x;this->y=y; } //判断 2 个坐标是不是同一个位置 bool equals(Position pos) {return this->x==pos.x && this->y==pos.y; } //自我显示 void desc() {cout<<"x:"<<x<<"y:"<<y<<endl; }};
- 创建栈 。
这里使用 STL提供的stack容器 。别忘记包含<stack>头文件 。//全局声明stack<Position> myStack;
- 核心搜索算法 。
int main(int argc, char** argv) { //起点位置 Position startPos(1,1); //终点位置 Position endPos(8,8); //保存走过的位置 vector<Position> paths; //向栈中压入起始位置 mazeStack.push(startPos); //设置起始位置为已经访问过 maze[startPos.x][startPos.y]=-1; //临时存储栈顶位置 Position tmp; while(!mazeStack.empty()) {//取出栈顶位置tmp=mazeStack.top();//删除栈顶数据mazeStack.pop(); //当前搜索位置存储在 vector 中paths.push_back(tmp);//判断是否已经到了终点if (tmp.equals(endPos)) {//到达终点,结束break;} else {for(int i=0; i<4; i++) {//查找当前位置 4 个方向有无可通行位置,并压入栈中Position nextPos(tmp.x+dirs[i].xOffset,tmp.y+dirs[i].yOffset);if(maze[nextPos.x][nextPos.y]==0) {mazeStack.push(nextPos); //标识为已经被压入,避免重复压入maze[nextPos.x][nextPos.y]=-1;}}} } //显示搜索路径 for(int i=0;i<paths.size();i++){tmp=paths[i];tmp.desc(); } return 0;}执行结果:
文章插图
在演示图中标注出搜索路径 , 可验证搜索到的路径是可行的 。
文章插图
6. 总结本文编码实现了顺序栈和链式栈,简要介绍了STL中的stack容品,并使用它解决了典型的迷宫问题 。
【C++栈和典型迷宫问题】
推荐阅读
- vivoX70pro和苹果11区别对比_哪款更值得入手
- 小米10s和小米10拍照哪个好_小米10s和小米10拍照对比
- vivox70pro+和小米11Ultra那个好_详细对比
- C++ 标准文档
- MatrixOne从入门到实战04——MatrixOne的连接和建表
- MyBatis之ResultMap的association和collection标签详解
- 和平精英粉红小猪怎么获得
- 兰蔻196口红和阿玛尼405哪个好看?颜色更显白?
- airpods 3和AirPods pro的区别_哪款更值得买
- 荣耀v40和小米11哪个好_荣耀v40和小米11哪个值得买