我给的建议是,如果你不是很理解这个问题的话,或者完全不懂,那么请进行默读或者朗读,并且边读边想
这里我在网上找了一个视频,有基本思路的讲解,看完可以看以下 的代码讲解
迷宫问题链接

我们将问题分块解释

#include<iostream>
const int M = 8, N = 8;
const int Maxsize = 200;
using namespace std;int mg[M + 2][N + 2] =
{{1,1,1,1,1,1,1,1,1,1},{1,0,0,1,0,0,0,1,0,1},{1,0,0,1,0,0,0,1,0,1},{1,0,0,0,0,1,1,0,0,1},{1,0,1,1,1,0,0,0,0,1},{1,0,0,0,1,0,0,0,0,1},{1,0,1,0,0,0,1,0,0,1},{1,0,1,1,1,0,1,1,0,1},{1,1,0,0,0,0,0,0,0,1},{1,1,1,1,1,1,1,1,1,1}
};
//运用1和0对不可以走和可以走的方块进行标志
typedef struct
{int i;         //当前方块的行号int j;         //当前方块的列号int di;        //di是下一可走相邻方位的方位号
}Box;              //定义方块类型typedef struct
{Box data[Maxsize];   //因为没走一步相当于进栈,并且要把那个方块的各个性质带到栈中//所以用上面定义好了的BOX结构体类型来定义数组int top;      //栈顶指针
}StType;          //声明顺序栈类型//初始时,入口(i,j)作为当前方块
//所有走过的方块都会进栈

走迷宫的过程跟进栈出栈一样,移动一个方位就进栈,走不动了,就原路退回,就相当于退栈,所以所以就想到用栈来解决问题。

Box中的di指的是方位,一开始进栈时,它是被初始化为-1的,这表示它还没有进行试探,还没有试探周围那一个方块可以走。
假设上面的方位为0,右为1,下为2,左为3
当开始试探时,就会对di进行赋值,比如上边可以走,那么di就为0,若上边走不通,则试右边,右边走得通,那么di就为1
(这些方位数、时针顺序等都是人为设定的,你也可以自己定义)

void InitStack(StType*& st)
{st = (StType*)malloc(sizeof(StType));st->top = -1;
}
bool StackEmpty(StType* s)
{return (s->top == -1);
}
bool Push(StType*& s, Box e)
{if (s->top == Maxsize - 1)return false;s->top++;s->data[s->top] = e;return true;
}
bool GetTop(StType* s, Box& e)
{if (s->top == -1)return false;e = s->data[s->top];return true;
}
bool Pop(StType*& s, Box& e)
{if (s->top == -1)return false;e = s->data[s->top];s->top--;return true;
}
void DestroyStack(StType*& s)
{free(s);
}

上面这些都是栈的基本操作,后面会用到
我准备了一个有注释的和没注释的代码

//用栈求一条迷宫路径的算法:(xi,yi),(xe,ye)
bool mgpath(int xi, int yi, int xe, int ye)
{Box path[Maxsize], e;int i, j, di, i1 = 0, j1 = 0, k;bool find;StType* st;InitStack(st);               //初始化栈顶指针e.i = xi; e.j = yi; e.di = -1;//设置e为入口Push(st, e);                //方块e进栈mg[xi][yi] = -1;while (!StackEmpty(st)){GetTop(st, e);i = e.i; j = e.j; di = e.di;if (i == xe && j == ye){cout << "一条迷宫路径如下:" << endl;k = 0;while (!StackEmpty(st)){Pop(st, e);path[k++] = e;}while (k >= 1){k--;cout <<"\t"<<path[k].i << path[k].j;if ((k + 2) % 5 == 0)cout << endl;}cout << endl;DestroyStack(st);return true;}find = false;while (di < 4 && !find){di++;switch (di){case 0:i1 = i - 1; j1 = j; break;case 1:i1 = i; j1 = j + 1; break;case 2:i1 = i + 1; j1 = j; break;case 3:i1 = i; j1 = j - 1; break;}if (mg[i1][j1] == 0)find = true;}if (find){st->data[st->top].di = di;e.i = i1; e.j = j1; e.di = -1;Push(st, e);mg[i1][j1] = -1;}else{Pop(st, e);mg[e.i][e.j] = 0;}}DestroyStack(st);return false;
}

接下来将上述代码分段解释

bool mgpath(int xi, int yi, int xe, int ye)
{Box path[Maxsize], e;int i, j, di, i1 = 0, j1 = 0, k;bool find;StType* st;InitStack(st);               //初始化栈顶指针e.i = xi; e.j = yi; e.di = -1;//设置e为入口Push(st, e);                //方块e进栈mg[xi][yi] = -1;


一开始就是这么进栈的,这是第一个元素,并且要注意mg[xi][yi] = -1和di=-1是不同的,前者是表示将迷宫值,也就是开头定义的数组的值其中一个变为-1,让其不能走(只有迷宫值0是可以走的,其它都不可以走),避免走到下一个,又走回来(在有其它路的情况下),也就是为了避免来回循环
后者是表示未试探(上面已经说过)

while (!StackEmpty(st))          //上面有一个入口方块被压入,所以可以进行循环{GetTop(st, e);      //获取栈顶的元素i = e.i; j = e.j; di = e.di;      //将栈顶方块的元素赋给i,j,diif (i == xe && j == ye)           //判断是否坐标是出口{cout << "一条迷宫路径如下:" << endl;k = 0;while (!StackEmpty(st))           //不断将元素弹出,只不过最后走的那一步,是最为第一个进入数组path中的//所以要想要得到从入口到出口的顺序则需将path倒序输出{Pop(st, e);            path[k++] = e;}while (k >= 1)       //这里不是大于等于0,与k++有关,看下句注释即可理解{k--;            //前面k++每个都多加了一个1,所以每个都得减一cout <<"\t"<<path[k].i << path[k].j;if ((k + 2) % 5 == 0)    //这是经验值,因为只有在这个迷宫里面才是加二,看下面图片即可知cout << endl;}cout << endl;DestroyStack(st);return true;      //完成输出后,因为它是个bool函数,而它的使命就是输出走出迷宫路径,使命完成了,自然就得return}


这是将这个例子的k值减减后一个个输出的结果,可以发现当k+2等于5的倍数时,就会换一次行,所以输出的是5个5个一行。

        find = false;          //假设找不到while (di < 4 && !find)    //两个条件:在找不到的情况下,从0-3一个一个找//这里的!find也可以在里面换成用break{di++;switch (di){case 0:i1 = i - 1; j1 = j; break;case 1:i1 = i; j1 = j + 1; break;case 2:i1 = i + 1; j1 = j; break;case 3:i1 = i; j1 = j - 1; break;}if (mg[i1][j1] == 0)find = true;//发现如果下一个点位的迷宫值为0,则说明可走,即找到}if (find)    //如果找到的话,就进行进栈操作,而人也将移动至发现的这个方块{st->data[st->top].di = di;//st指向data,data要di,所以这个代码的意思就是st指向的栈顶数组元素的die.i = i1; e.j = j1; e.di = -1;//把Box中的三项装入e中,后面即可压入栈中Push(st, e);mg[i1][j1] = -1;       //上面有解释过}else                    //如果不是记得要退栈,并且将退出去的那个元素赋值变回原来的0,这其实就是四面被堵死{Pop(st, e);mg[e.i][e.j] = 0;}}DestroyStack(st);return false;
}

用循环让其重复进栈出栈的过程,最后看是否能到达出口

int main()
{if (!mgpath(1, 1, M, N))//这里很坑//发现是return false的话就输出下面语句//如果是return true的话就不输出下面语句,而是会输出迷宫路径(mgth函数已经写好)cout << "该迷宫问题没有解!";return 1;
}

迷宫问题超详解(栈实现)相关推荐

  1. JAVA 多线程并发超详解

    JAVA 多线程并发超详解(未完,下一篇文章还有) 1. JAVA 多线程并发 1.1.1. JAVA 并发知识库 1.1.2. JAVA 线程实现/创建方式 1.1.2.1. 继承 Thread 类 ...

  2. Android vector标签 PathData 画图超详解

    此文章来源于https://www.cnblogs.com/yuhanghzsd/p/5466846.html点击打开链接 Android vector标签 PathData 画图超详解 SVG是一种 ...

  3. Mybatis案例超详解

    Mybatis案例超详解 前言: 本来是想像之前一样继续跟新Mybatis,但由于种种原因,迟迟没有更新,快开学了,学了一个暑假,博客也更新了不少,我觉得我得缓缓,先整合一些案例练练,等我再成熟点理解 ...

  4. python控制手机模拟器_Appium+python自动化之连接模拟器并启动淘宝APP(超详解)...

    简介 上一篇讲解完模拟器的安装.配置好以后,就好比我们手机已经买好,并且系统已经做好了,就差我们用数据线和电脑连接开始实战了,这篇宏哥就带着小伙伴们和童鞋们趁热打铁,讲解和分享一下如何连接模拟器(电脑 ...

  5. js打印三角形超详解

    js打印三角形超详解 j控制星星的总行数,i控制每行星星的打印个数 打印图形如下: (1) (2) //str=""用来存储星星// 理解步骤1:在一行输出6个星星如何操作,在循环 ...

  6. 线性规划之单纯形法【超详解+图解】-转载

    线性规划之单纯形法[超详解+图解] 目录 1.作用 2.线性规划的一般形式 5.1几何意义 5.2如何判断最优 5.3如何选择新的基变量 5.4如何选择被替换的基变量 5.5终止条件 标准型: 转化为 ...

  7. 【平衡小车制作】(七)串级PID调参及平衡成果展示(超详解)

      大家好,我是小政.本篇文章我将针对PID调参进行详细的讲解,让每位小伙伴能够对比例.积分.微分三个参数如何调节有更加清晰的理解. 一.调参步骤 确立机械中值 直立环(内环)--Kp极性.Kp大小. ...

  8. 蓝牙模块XY-MBD07A的介绍及使用方法(超详解)

    蓝牙模块XY-MBD07A的介绍及使用方法(超详解) 蓝牙XY-MBD07A是主从一体的蓝牙串口模块,简单的说,当蓝牙设备与蓝牙设备配对连接成功后,我们可以忽视蓝牙内部的通信协议,直接将将蓝牙当做串口 ...

  9. C/C++实现蛇形矩阵(超详解)【沈七】

    C/C++实现蛇形矩阵(超详解) 题目链接 题目描述 输入样例 题解部分 完整代码 完结散花 悄悄告诉你: 参考文章 萌新报道! 唤我沈七就行嘿嘿. 大一软件工程在读. 菜鸡蒟蒻想在博客中记录一些算法 ...

最新文章

  1. Spring boot——起步依赖
  2. 如何在C#中使用Win32和其他库之三
  3. 自然语言生成任务,如文本摘要和图像标题的生成。seq2seq的模型原理
  4. 线下实战(这次包含北京)
  5. java中JOptionPane类_Java学习之JOptionPane类
  6. 30个php操作redis常用方法代码例子
  7. 苹果手机升级13无法开机_苹果手机更新系统后无法开机
  8. 1104报表背景知识
  9. 还能这样玩——关于一些OI的黑(sao)科(cao)技(zuo)优化
  10. Quirks模式与标准模式
  11. ESD5V5U5ULC TVS DIODE SC74-6 TVS - 二极管
  12. 2019最新抖音全方位数据分析报告
  13. java基础-1 基础知识
  14. 软考系统架构师教材推荐和学习方法
  15. Houdini `@pdg_output`找不到文件
  16. python 学习笔记1
  17. mysql INSERT语句加where 条件
  18. 风电场风速两参数weibull(威布尔)分布研究(Matlab代码实现)
  19. 暗夜精灵6-ubuntu18.04-显卡驱动
  20. Go语言运行环境、IDE配置

热门文章

  1. npm ERR code EEXIST 报错 解决方案
  2. Nature子刊:基于静息态EEG功能连接模式识别精神疾病亚型
  3. URL解析过程和浏览器渲染机制【面试必问、深入解析 下一次再也不怕面试官问这个问题】
  4. Mysql死锁排查及解决办法
  5. Squoosh在线无损图片压缩工具中文版,JPG/webP/PNG/互转
  6. php视频转音频文件怎么打开,视频怎么转音频格式 MP4格式怎样转MP3格式
  7. 浅析JWT| JWT是啥子,Java构建JWT
  8. oracle使用PLSQL导出dmp文件一闪而过的解决办法
  9. 阿里云服务器1Mbps带宽到底能够达到什么效果
  10. 【buuctf】cscctf_2019_qual_babyheap