数据结构——迷宫问题(顺序栈、C++)_迷宫问题c++-程序员宅基地

技术标签: c++  数据结构  

 讲解:

一、采用二维数组和srand函数随机生成只有0和1的迷宫。

二、求解迷宫大概思路:先将入口处的坐标即方向d入栈,然后当栈不为空时,取出栈顶(即当前节点)的数据。遍历当前节点的四个方向,找到可行的下一个节点,并将其入栈;如没有可行的下一个节点,则将当前节点值0(表示未走过),然后出栈,退回到前一个节点进行遍历。当栈顶数据和出口一致时,输出迷宫的通路。

#include <iostream>
#include <time.h>
#define M 100
#define N 100
#define MAXSIZE 100
using namespace std;

int maze[M][N];

void CreateMaze(int m, int n)       //创建迷宫
{
    srand(time(NULL));
    for(int i=1;i<m+1;i++)
    {
        for(int j=1;j<n+1;j++)
        {
           maze[i][j] = rand()%2;    //只有0和1的随机迷宫
        }
    }

    maze[1][1] = -1; //直接入口置-1,表示可走
    maze[m][n] = 0; //出口

    for(int i=0;i<m+2;i++) maze[i][0] = 1;    //设置围墙
    for(int i=0;i<m+2;i++) maze[i][m+1] = 1;
    for(int j=0;j<n+2;j++) maze[0][j] = 1;
    for(int j=0;j<n+2;j++) maze[n+1][j] = 1;
}

void Print(int m,int n)              //打印迷宫
{
    for(int i=0;i<m+2;i++)
    {
        for(int j=0;j<n+2;j++)
        {
            if(maze[i][j] == 0)
              cout << "  ";
            if(maze[i][j] == 1)
              cout << "□";
        }
        cout << endl;
    }

}

typedef struct    //定义当前位置坐标
{
    int x;
    int y;
    int d;   //移动方向
}Point;

typedef struct    //定义顺序栈
{
    Point data[MAXSIZE];  //定义顺序栈的存储类型为结构体data
    int top;
}SqStack;

bool MazePath(int x1,int y1,int m, int n)
{
    int i,j,d,find;
    SqStack S;
    S.top = -1;  //初始化栈
    S.top++;
    S.data[S.top].x = x1; S.data[S.top].y = y1; S.data[S.top].d = -1;
    while(S.top>-1)
    {
        i = S.data[S.top].x; j = S.data[S.top].y; d = S.data[S.top].d;
        if(i==m&&j==n)
        {
            cout << "找到路径:" << endl;
            for(int i=0;i<m+2;i++)
            {
                for(int j=0;j<n+2;j++)
                {
                    if(maze[i][j] == 1)
                        cout << "□";
                    else if(maze[i][j] == 0)
                        cout << "  ";
                    else
                        cout << " *";
                }
                cout << endl;
            }
        return true;
        }


        find = 0;        //设置标识,1表示找到下一个可行路径,0表示没有找到
        while(d<4&&find==0)       //遍历4个方向:0->东,1->南,2->西,3->北
        {
            d++;
            switch(d)
            {
            case 0:
                i = S.data[S.top].x+1; j = S.data[S.top].y; break;
            case 1:
                i = S.data[S.top].x; j = S.data[S.top].y+1; break;
            case 2:
                i = S.data[S.top].x-1; j = S.data[S.top].y; break;
            case 3:
                i = S.data[S.top].x; j = S.data[S.top].y-1; break;
            }
            if(maze[i][j] == 0) find = 1;  //找到路径,标识置1,退出循环
        }

        if(find == 1)  //找到路径
        {
            S.data[S.top].d = d;  //记录当前节点往下一个节点的方向
            S.top++;              //下一个节点入栈
            S.data[S.top].x = i;
            S.data[S.top].y = j;
            S.data[S.top].d = -1;  //将下一个节点的走向置为-1
            maze[i][j] = -1;  //当前点置-1,表示走过
        }
        else  //未找到路径
        {
            maze[S.data[S.top].x][S.data[S.top].y] = 0;  //当前点置为0,表示未走过
            S.top--;  //出栈
        }
    }
    return false;
}


int main()
{
    int m,n;
    int k=1;
    while(k)
    {
      cin >> m >> n;
      CreateMaze(m,n);
      Print(m,n);
      if(!MazePath(1,1,m,n))
      {
            cout << "找不到路径"<<endl;
            k++;
      }
    else k=0;
    }
}

运行结果:(由于随机生成大概率没有通路,所以输出较小的迷宫容易出结果)

 

 写的很简陋,有不足之处请指正。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/m0_53468233/article/details/126110806

智能推荐

在jupyter notebook运行指定conda虚拟环境(附带sklearn安装教程)_新建的annaconda虚拟环境怎么用jupyter打开-程序员宅基地

文章浏览阅读2.3k次,点赞5次,收藏25次。在jupyter notebook运行指定conda虚拟环境(附带sklearn安装教程)_新建的annaconda虚拟环境怎么用jupyter打开

软件实施流程(八大阶段)——软件实施工程师_软件实施指导-程序员宅基地

文章浏览阅读3.8k次。软件实施工程师软件实施工程师的工作是软件产品服务主线的一个决定性环节,软件的成功离不开实施。主要负责工程实施: 包括常用操作系统、应用软件及公司所开发的软件安装、调试、维护,还有少部分硬件、网络的工作;负责现场培训: 现场软件应用培训;协助项目验收;负责需求的初步确认;把控项目进度;与客户沟通个性化需求;负责项目维护。软件产品。_软件实施指导

KlayGE 4.0中Deferred Rendering的改进(四):GI的神话-程序员宅基地

文章浏览阅读59次。转载请注明出处为KlayGE游戏引擎上一篇解决了透明物体的渲染问题;本文将挑战另一个实时渲染的神话,实时全局光照(GI)。实时全动态GI目前direct lighting在游戏中日趋成熟,比较前卫的游戏引擎已经不满足于diect lighting的效果了,逐渐开始尝试indirect lighting。早期的方法有通过离线渲染light map来实现静态场景、静态光源的GI。接着出现...

初识Git_git必须用网络吗-程序员宅基地

文章浏览阅读433次。Git 是一个开源的分布式版本控制系统,用于敏捷高效地处理任何或小或大的项目。Git 是 Linus Torvalds 为了帮助管理 Linux 内核开发而开发的一个开放源码的版本控制软件。Git 与常用的版本控制工具 CVS, Subversion 等不同,它采用了分布式版本库的方式,不必服务器端软件支持。简言概括:Git就是分布式版本控制。_git必须用网络吗

搭建Vulhub靶场 【附图】_vulhub靶场搭建-程序员宅基地

文章浏览阅读2.1w次,点赞59次,收藏265次。目录0x01简单概述0x02安装环境1. kali设置2. 更新软件源中的所有软件列表3. 安装https协议及CA证书0x03安装步骤一、安装Docker1. 下载安装2. 查看Docker是否安装成功3. 查看docker基本信息二、安装vluhub1. 安装pip32. 安装Docker-Compose3. 查看docker-compose版本三、安装vulhub靶场1. 克隆下载2. 随便进入一个靶场环境目录3. 对靶场进行编译4. 运行此靶场5. 查看启动环境6. 通过浏览器访问7. 关闭此靶场环_vulhub靶场搭建

sensei鼠标测试软件,「硬核测试:游戏鼠标精准度」赛睿SENSEI 310-程序员宅基地

文章浏览阅读564次。原标题:「硬核测试:游戏鼠标精准度」赛睿SENSEI 310作为赛睿最热销游戏鼠标之一,310有SENSEI(对称)和RIVAL(右手)两个版本,均采用今天要测的TrueMove3引擎,是基于PMW3360打造的1:1真实追踪的引擎,虽然现在“1:1引擎”很多了,但TrueMove出来时这个概念还是很新颖的,尤其是提到了消除抖动,最大限度的保持理论和实际DPI的稳定性,那么到底是不是真的1:1呢,..._鼠标精确度检测软件

随便推点

Power BI DAX 分组排名 分层排名_powerbi分组排名-程序员宅基地

文章浏览阅读2.2k次,点赞5次,收藏2次。这个DAX公式采取类似Excel行上下文的功能,首先建立一个参数等于类别,在Rankx函数第一个参数添加一个Filter,实现同一类别内进行排名,即分层排名。上述DAX公式使用的是ALLEXCEPT函数,是ALL家族函数,功能是除了第二个参数【类别】都是行上下文计算排名,这样就实现了分组分层排名。如上例,Rankx只有前两个参数是必要的,实际可以输入五个参数,设置排序方式。通过在第一个参数添加函数可以实现进阶功能,例如分组分层排名,依旧使用上述数据。再使用Rankx计算排名。首先建立销售和度量值。_powerbi分组排名

快速访问中的ftp文件夹右键没有选项,无法删除如何解决-程序员宅基地

文章浏览阅读894次。随便在以一个目录里新建一个快捷方式,填上ftp地址,如下:下一步,然后删除此快捷方式,那废的ftp就没了转载于:https://www.cnblogs.com/shuangfeike/p/11413734.html..._群辉的ftp文件点右键没有编辑功能

mybatis根据数组批量查询_前端传入的是long型的数组后端在mybatis中怎么批量查询-程序员宅基地

文章浏览阅读1.8k次。接口/** * 从页面接收的数据是多值数据,就是一个数组,它不想转成其它类型,直接把数组丢给dao */ public List<Emp> queryByArray(Integer[] empnos);EmpMapper.xml配置文件<select id="queryByArray" resultType="emp"> select <incl..._前端传入的是long型的数组后端在mybatis中怎么批量查询

python词云是什么意思_python生成词云-程序员宅基地

文章浏览阅读715次。前言在大数据时代,你竟然会在网上看到的词云,例如这样的。看到之后你是什么感觉?想不想自己做一个?如果你的答案是正确的,那就不要拖延了,现在我们就开始,做一个词云分析图,Python是一个当下很流行的编程语言,你不仅可以用它做数据分析和可视化,还能用来做网站、爬取数据、做数学题、写脚本替你偷懒……如果你之前没有编程基础,没关系。希望你不要限于浏览,而是亲自动手尝试一番。到完成的那一步,你不仅可以做出..._词云是什么意思

nginx_nginxl-程序员宅基地

文章浏览阅读469次。什么是nginxNginx (engine x) 是一个高性能的HTTP和反向代理web服务器,使用c语言编写的一款web服务软件.Nginx是一款轻量级的Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,在BSD-like 协议下发行。其特点是占有内存少,并发能力强,事实上nginx的并发能力在同类型的网页服务器中表现较好,中国大陆使用nginx网站用户有:百度、京东、新浪、网易、腾讯、淘宝等。为什么使用nginx?作用1.反向代理2.负载均衡。3.._nginxl

英语 | Day 33、34 x 句句真研每日一句(找从句、意译)_句句真研每日一句答案在哪-程序员宅基地

文章浏览阅读465次,点赞2次,收藏3次。Day 33Day 34_句句真研每日一句答案在哪