栈的应用——深度优先搜索(走迷宫)

2023-11-03

栈应用到走迷宫(寻路算法)的做法

迷宫就是下图所示的这种,这次主要是先用代码画出一个迷宫(利用二维数组),然后寻路走到出口

代码如下:(在C++中运行)

mystack.h

#include<stdlib.h>
#include<stdio.h>
struct Point  //这个就是显示的坐标点位置,其余都一样,只是data的类型变了,变为坐标
{
        int _x;
        int _y;
};

struct Node
{
        Point data;
        Node* next;
};

struct Stack
{
        Node*top;
};

void initStack(Stack*s);
bool isStackEmpty(Stack*s);
void push(Stack*s,Point data);
Point pop(Stack*s);
void resetStack(Stack*s);
void destroyStack(Stack*s);

mystack.cpp

#include"mystack.h"
void initStack(Stack*s) //这些跟栈的基本一样,除了Point类型
{
    s->top=(Node*)malloc(sizeof(Node));
    s->top->next=NULL;
}
bool isStackEmpty(Stack*s)
{
    return s->top->next==NULL;
}
void push(Stack*s,Point data)
{
    Node *cur=(Node*)malloc(sizeof(Node));
    cur->data=data;
    cur->next=s->top->next;
    s->top->next=cur;
}
Point pop(Stack*s)
{
    Node *t=s->top->next;
    s->top->next=t->next;
    Point ch=t->data;
    free(t);
    return ch;
}
void resetStack(Stack*s)
{
    while(!isStackEmpty(s))
        pop(s);
}
void destroyStack(Stack*s)
{
    resetStack(s);
    free(s->top);
}


 

main函数(关键!)

#include <iostream>
#include"mystack.h"
#include <windows.h>
#define MAXROW 10
#define MAXLINE 10
//宏定义把迷宫 长宽都定义成10
using namespace std;
Stack s;  //变成全局,方便调用
int maze[MAXROW][MAXLINE] =     //这里就是画一个10*10的迷宫,0代表能走的路
{
    1,1,1,1,1,1,1,1,1,1,
    0,0,0,1,1,1,1,1,1,1,
    1,1,0,1,1,1,1,1,1,1,
    1,1,0,0,0,0,1,1,1,1,
    1,1,0,1,1,0,1,1,1,1,
    1,1,0,1,0,0,0,1,1,1,
    1,1,1,1,1,0,1,1,1,1,
    1,1,1,1,1,0,0,0,1,1,
    1,1,1,1,1,1,1,0,0,0,
    1,1,1,1,1,1,1,1,1,1,
};

void displyMaze()
{
    for(int i=0; i< MAXROW; i++)
    {
        for(int j=0; j<MAXLINE; j++)
        {
            if(maze[i][j] == 1) printf("%2s"," *");          //代表迷宫的墙
            else if(maze[i][j] == 2) printf("%2s"," #"); //代表走过的路,用#代表
            else printf("%2s"," ");                               //代表迷宫的路
        }
        putchar(10);
    }
    printf(" ====================\n");
}

void visit(int x,int y)
{
    Point p={x,y};
    push(&s,p);
}

int main()
{
   // displyMaze();
    Point sp={1,0},ep={8,9};//迷宫起点和终点(结构体只能这样初始化)

    // 这里要寻路,用了栈的思想,把下一步压入栈,走到这步,弹出,
    // 这样就能走完一步标记一步,而且若遇到分岔口,几条路的下一步都压入栈
//寻路的基本原理,就是压栈出栈,若能压栈,就出栈,再寻找上下左右能继续压栈出栈的位
    initStack(&s);
    push(&s,sp);
    int flag=1;

    while(!isStackEmpty(&s))
    {
        Point t;
        t=pop(&s);              //弹出栈里存的点(这个点就是当前位置的点)
        maze[t._x][t._y]=2;  //表示走过的路,标记为 2

        system("cls");    //这是自动寻路刷新界面,然后有寻路动画
        displyMaze();
        Sleep(100);

        //竖是x轴. 横是y轴(数组的原理)
        //判断各方向的点能不能走,1.坐标从0开始 2.不能是死路 3.不能是走过的路   

        //上
        if(t._x-1>=0&&maze[t._x-1][t._y] == 0)
            visit(t._x-1,t._y);
        //下
        if(t._x+1<=9&&maze[t._x+1][t._y] == 0)
            visit(t._x+1,t._y);
        //左
        if(t._y-1>=0&&maze[t._x][t._y-1] == 0)
            visit(t._x,t._y-1);
        //右
        if(t._y+1<=9&&maze[t._x][t._y+1] == 0)
            visit(t._x,t._y+1);

        if(t._x==ep._x&&t._y==ep._y)
        {
            flag=0;    //给定找到出口的标志位
            destroyStack(&s);
            break;
        }

    }
    if(flag==0)
    {
          cout<<"find path"<<endl;
    }
    else
        cout<<"find no path"<<endl;
    return 0;
}


寻路遇到岔路口的话,这时候主要是看上下左右的顺序,后压入栈的,会继续在后压入栈的这条路上继续走下去,如果走到死胡同,便继续回到原来岔路口,压入栈的地方。
我这里代码,具体压入栈的顺序是上下左右,那么最先判断的是右边,最后才是上。然后若走进死路,那最先判断的是上一个压入栈的地方,那就是离他最近的岔路口。

 

这是利用的栈思想寻路的关键,这是深度优先搜索,一条路走到底再换一条路。可以自行改变上下左右顺序或者改变迷宫都可以看出。
 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

栈的应用——深度优先搜索(走迷宫) 的相关文章

随机推荐

  • 【华为OD机试2023】产品最差奖 C++ Java Python

    华为OD机试2023 产品最差奖 C Java Python 前言 如果您在准备华为的面试 期间有想了解的可以私信我 我会尽可能帮您解答 也可以给您一些建议 本文解法非最优解 即非性能最优 不能保证通过率 Tips1 机试为ACM 模式 你
  • Java基础-对象反序列化

    对象反序列化 使用到的流是对象字节输入流 ObjectInputStream 作用 以内存为基准 把存储到磁盘文件中去的对象数据恢复成内存中的对象 称为对象反序列化 package per mjn serializable import j
  • Spring mvc 集成Swagger2

    Spring mvc 集成Swagger2 Spring mvc 集成Swagger2 效果 问题1 swagger界面可以打开 但是接口不显示 问题2 Could not resolve placeholder cardUrl in va
  • react 一键复制

    文章目录 方式一 react copy to clipboard组件 方式二 copy to clipboard 插件 方式三 原生js处理 方式四 clipboard 插件 方式一 react copy to clipboard组件 安装
  • win32-FileTimeToSystemTime的使用

    include
  • java从前端传数据到后台_javaWeb开发总结 ---- 前端数据插入到后台

    一 概述 本文主要描述如何将数据通过表单提交到后台并插入到数据库 其中后台使用spring框架 二 开发流程 明确需求 即将什么数据插入到数据库 平台搭建 配置spring 数据库 建表 走通springMVC 走通springMVC到数据
  • 项目经理和技术经理的区别

    一 关于项目经理 在没有真正进入软件行业之前 对于系统集成方面的项目还是有些心得的 有种一个人事无巨细的带一票人打江山的感觉 项目合同要负责 项目具体需求要负责 项目人员分配要负责 项目实施要指挥 管理心态 是关键 不懂技术 可以 不懂全局
  • 将字符串中的‘*’移动到字符串最前面且不改变原来非‘*’字符的顺序

    过程如下图所示
  • 带你理解运算放大器

    复习一下电子设计基本元器件 运算放大器 矜辰所致 目录 前言 一 运放基本说明 1 1 基本认识 1 2 运放中的电流 1 3 运放工作特性 二 负反馈 2 1 什么是负反馈 2 2 为什么要引入负反馈 负反馈电路分析 2 3 正反馈 三
  • Padavan(老毛子)脚本自动切换网关和 DNS 服务器

    家中网络连接示意图 已省略接在主路由上的光猫 基本情况 联通宽带 光猫改桥接 主路由拨号 主路由红米AC2100 RM2100 老毛子系统 padavan 3 4 3 9 099 20200619 IP 10 0 0 1 NAS 蜗牛星际A
  • SVN文件夹图标不正常显示解决方案(win10)android studio

    在使用Android Studio提交代码时发现svn图标莫名其妙的不显示 其他操作都正常 在网上搜了一堆资料都有各种说法 结合了操作 一步步来试终于给我找到了 在这我自己总结一下 一部分也是拷贝别的图片 写一篇清楚文章好希望能帮助和我遇到
  • frp实现内网穿透(内网服务器到公网访问的方案)

    目录 背景 一 frp的简介 二 Frp Server的配置 三 Frp Client的配置 背景 我使用python写了一个http后端 如代码所示 ip为10 1 136 73 port为8000 现在需要把http后端在公网可以被使用
  • echarts 中x轴 设置步长,间隔的距离

    如果你已经使用了 echarts xAxis axisLabel interval 5 在 xAxis 下面 axisLabel 里面的 interval 值即可 interval 为 0 时 所有的标签都显示出来 interval 表示步
  • 详解ThreadLocal

    提示 文章写完后 目录可以自动生成 如何生成可参考右边的帮助文档 文章目录 1 ThreadLocal介绍 1 1 官方介绍 1 2 基本用法 1 2 1 常用方法 1 2 2 使用案例 1 3 ThreadLocal与synchroniz
  • [Python人工智能] 四.TensorFlow创建回归神经网络及Optimizer优化器

    从本篇文章开始 作者正式开始研究Python深度学习 神经网络及人工智能相关知识 前一篇文章讲解了TensorFlow基础和一元直线预测的案例 以及Session 变量 传入值和激励函数 这篇文章将详细介绍TensorFlow创建回归神经网
  • 少儿编程有必要吗?

    这几年 人工智能正以难以想象的速度向前开展 AlphaGo赢了柯洁 百度无人巴士量产 京东开端启用机器人送快递 谷歌的AI都学会了自行freestyle 科技的推翻式立异 随之引发教育风向大变革 除了语数外 老三样 的根底教育外 一门新兴学
  • STM32驱动HC05蓝牙串口通信模块

    前言 时不可以苟遇 道不可以虚行 今天分享一下最近学习的 HC05 蓝牙模块 通过用 手机蓝牙控制 STM32 单片机 进行 点灯 传输数据 显示波形 等基础操作 一 介绍 HC05模块是一款高性能主从一体蓝牙串口模块 说白了 只是个蓝牙转
  • oracle排序后从相同的顺序中随机取一行

    要求 要求从这个表取数据 v2字段相同的 随机取一个出来 第1 2随机取一行 第5 6 7行随机取一行 其他的3 4行都保留 效果展示 查询语句写法 Select s from select t row number over partit
  • 【数据分析】数据分析方法(六):相关分析 & 群组分析

    数据分析方法 六 相关分析 群组分析 1 相关分析方法 当我们研究两种或者两种以上数据之间有什么关系的时候 就要用到相关分析 在解决问题的过程中 相关分析可以帮助我们扩大思路 将视野从一种数据扩大到多种数据 通过计算相关系数 我们可以看到两
  • 栈的应用——深度优先搜索(走迷宫)

    栈应用到走迷宫 寻路算法 的做法 迷宫就是下图所示的这种 这次主要是先用代码画出一个迷宫 利用二维数组 然后寻路走到出口 代码如下 在C 中运行 mystack h include