深度优先遍历解决迷宫问题(顺序栈的应用)

学习贺利坚老师课程

数据结构例程——迷宫问题(用栈结构)_数据结构迷宫问题-CSDN博客文章浏览阅读3.1w次,点赞25次,收藏118次。本文针对数据结构基础系列网络课程(3):栈和队列中第6课时栈的应用2-迷宫问题。例:求出从入口到出口的路径 程序实现:#include #define MaxSize 100#define M 8#define N 8int 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},_数据结构迷宫问题https://blog.csdn.net/sxhelijian/article/details/48465369本人详细解析博客

迷宫问题构思_概要设计 迷宫问题-CSDN博客文章浏览阅读1.4k次,点赞6次,收藏4次。背景:交通运输是支撑国民经济发展的重要产业,承担着促进商品的高效快捷流转的使命,物流行业在现代社会发展中有着十分积极的作用,在新的时代背景下物流业需要更加智能化的管理与服务模式。“智慧物流”起源于IBM提出的“智慧地球”这一概念,经过我国政府“感知中国”、“互联网+物流”建设战略,智慧物流迅速崛起。智慧物流可以深入推动供应链整合升级,促进物流行业创新发展与结构调整,为物流行业在影响社会生产与物资流通的同时,转变产业发展方式以满足客户的需求,促进产品流通。_概要设计 迷宫问题https://blog.csdn.net/qq_57484399/article/details/127308349版本更新日志

v1.0 : 重构命名语句, 让代码易读,  地图可视化显示, 方便玩家观看

main里面的子函数与结构:

节点方向结构

typedef struct
{
    int x;
    int y;
    int direction;
}Map_Node;   //节点方向结构

路线栈

typedef struct
{
	Map_Node data[MaxSize];
	int top;
}Route_stack;     //路线栈

深度有限遍历寻路, 并记录路线的子函数

bool Find_path(int start_pointX,int start_pointY,int export_pointX,int export_pointY);

主函数调用

int main()
{
    int start_pointX;
    int start_pointY;
    int export_pointX;
    int export_pointY;
    bool result;
    for(int display_x = 1; display_x < X+1;display_x++)
    {
        if(display_x == 1)
        {
            printf(" →Y");
            printf("\t");
            for(int display_y = 1; display_y < Y+1;display_y++)
            {
                printf("%d ",display_y);
            }
             printf("\n");
             printf("↓ X");
             printf("\n");

        }

        printf(" %d ",display_x);
        printf("\t");
        for(int display_y = 1; display_y < Y+1;display_y++)
        {
            printf("%d ",mapper[display_x][display_y]);
        }
        printf("\n");
    }
    printf("\n请输入初始地址:\n(例如:1,1)");
    scanf("%d, %d", &start_pointX, &start_pointY);
    printf("\n请输入出口地址:\n(例如:8,8)");
    scanf("%d, %d", &export_pointX, &export_pointY);

    result = Find_path(start_pointX,start_pointY,export_pointX,export_pointY);
    if(result == 1)
    {
        printf("此路有解!");
    }
    else
    if(result == 0)
    {
        printf("此路无解!");
    }
    return 0;
}

main.cpp 源代码

#include <stdio.h>

#define MaxSize 100
#define X 8
#define Y 8

//地图坐标
int mapper[X+2][Y+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,0,1,1,1,0,1},
	{1,1,0,0,0,0,0,0,0,1},
	{1,1,1,1,1,1,1,1,1,1}
};


typedef struct
{
    int x;
    int y;
    int direction;
}Map_Node;   //节点方向结构

typedef struct
{
	Map_Node data[MaxSize];
	int top;
}Route_stack;     //路线栈

bool Find_path(int start_pointX,int start_pointY,int export_pointX,int export_pointY)
{
    //当探索前节点的x,y,当前节点的方向,是否已经找到
    int find_X,find_Y,find_direction,already_find;
    //定义计数变量
    int counter;
    //初始化路线栈
    Route_stack depth_route;
    //初始化栈顶指针
    depth_route.top = -1;

    //开始寻路(路线栈加入起点)
    depth_route.top++;
    depth_route.data[depth_route.top].x = start_pointX;
    depth_route.data[depth_route.top].y = start_pointY;
    //路线栈节点方向标明
    depth_route.data[depth_route.top].direction = -1;   //起点未标明方向

    //路线栈加入节点即被激活
    while(depth_route.top > -1)
    {
        //当前路线到达的节点
        find_X = depth_route.data[depth_route.top].x;
        find_Y = depth_route.data[depth_route.top].y;
        find_direction = depth_route.data[depth_route.top].direction;
        //判断当前节点是否到达终点
        if(find_X == export_pointX && find_Y == export_pointY)
        {
            //从栈底到栈顶,输出当前路线
            for(counter = 0; counter <= depth_route.top; counter++)
            {
                printf("\t(%d,%d)",depth_route.data[counter].x,depth_route.data[counter].y);
                if((counter+1)%5 == 0)
                {
                    printf("\n");
                }
            }
            printf("\n");
            return 1;

        }
        //如果不符合上述条件,则找下一个可走的方块
        //来一个标志,标志是否找到下一个可走方块,find(0未找到,1找到)
        //进而进行下一步位移操作
        already_find = 0;
        //判断栈顶节点此时,是否还有方向可走
        while(find_direction < 4 && already_find == 0)
        {
            find_direction++;
            switch(find_direction)
            {
                //从左上角出发,向下是x(0~n),向右是y(0~n)

                case 0:
                    find_X = depth_route.data[depth_route.top].x - 1;
                    find_Y = depth_route.data[depth_route.top].y;
                    break;
                case 1:
                    find_X = depth_route.data[depth_route.top].x;
                    find_Y = depth_route.data[depth_route.top].y + 1;
                    break;
                case 2:
                    find_X = depth_route.data[depth_route.top].x + 1;
                    find_Y = depth_route.data[depth_route.top].y;
                    break;
                case 3:
                    find_X = depth_route.data[depth_route.top].x;
                    find_Y = depth_route.data[depth_route.top].y - 1;
                    break;
            }
            //判断探索的节点,是否可以前进
            if(mapper[find_X][find_Y] == 0)
            {
                already_find = 1;
            }
            //在此while循环里,遍历此节点的所有方向,如果有通道,就可以走,跳出来开始去往下一个节点
        //如果已经遍历到最后一个方向 , 进来之后,也找不到下个可走方块,则赋值 already_find=0
        //此时是异常跳出
        }

        //判断是否找到下个可走方向
        if(already_find == 1)
        {
            //找到,则把find_x,find_y坐标及其探索方向,入栈
            depth_route.data[depth_route.top].direction = find_direction;
            //栈顶指针加一
            depth_route.top++;
            depth_route.data[depth_route.top].x = find_X;
            depth_route.data[depth_route.top].y = find_Y;
            //路线栈顶节点,方向置空 为-1
            depth_route.data[depth_route.top].direction = -1;
            //如果通过上述验证,则此节点已经加入路线,占用地图,标记为 -1
            mapper[find_X][find_Y] = -1;

        }
        //如果没找到下一个可走节点,则把栈顶节点退栈,找回头路的节点的下一个方向继续探索
        else
        {
            mapper[depth_route.data[depth_route.top].x][depth_route.data[depth_route.top].y] = 0;
            depth_route.top--;//退栈则不保存出栈元素
        }

    }
    return 0;
}

int main()
{
    int start_pointX;
    int start_pointY;
    int export_pointX;
    int export_pointY;
    bool result;
    for(int display_x = 1; display_x < X+1;display_x++)
    {
        if(display_x == 1)
        {
            printf(" →Y");
            printf("\t");
            for(int display_y = 1; display_y < Y+1;display_y++)
            {
                printf("%d ",display_y);
            }
             printf("\n");
             printf("↓ X");
             printf("\n");

        }

        printf(" %d ",display_x);
        printf("\t");
        for(int display_y = 1; display_y < Y+1;display_y++)
        {
            printf("%d ",mapper[display_x][display_y]);
        }
        printf("\n");
    }
    printf("\n请输入初始地址:\n(例如:1,1)");
    scanf("%d, %d", &start_pointX, &start_pointY);
    printf("\n请输入出口地址:\n(例如:8,8)");
    scanf("%d, %d", &export_pointX, &export_pointY);

    result = Find_path(start_pointX,start_pointY,export_pointX,export_pointY);
    if(result == 1)
    {
        printf("此路有解!");
    }
    else
    if(result == 0)
    {
        printf("此路无解!");
    }
    return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/725002.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

品牌为什么要做电商控价

消费者购买产品的途径愈发多样&#xff0c;抖音、快手等直播电商的兴起进一步拓宽了品牌的销售渠道。市场形态越是丰富&#xff0c;品牌所要应对的问题自然也就越多。主流电商平台如淘宝、拼多多&#xff0c;依然是消费者主要的选购之处&#xff0c;即便不购物&#xff0c;电商…

使用nvm管理nodejs版本,设置淘宝NPM镜像源

nvm-windows https://github.com/coreybutler/nvm-windows nvm配置文件的路径 C:\Users\用户名\AppData\Roaming\nvm 修改 settings.txt 文件&#xff0c;添加淘宝镜像源地址 node_mirror: https://npmmirror.com/mirrors/node/ npm_mirror: https://npmmirror.com/mirrors…

tauri嵌入外部二进制文件,以及sidecar是什么意思?

sidecar是什么意思 有时&#xff0c;为了使应用程序正常运行或防止用户安装额外的依赖项&#xff08;例如Node.js或Python或者ffmpeg等&#xff09;&#xff0c;你可能需要嵌入依赖的二进制文件&#xff0c;我们将这种二进制文件称为"sidecar"&#xff0c;中文意思就…

Navicat 重装 查找 保存的查询sql文件

背景&#xff1a;Navicat 一个收费的软件&#xff0c;存在的最大缺点就是收费&#xff0c;所以我们为了优化它会遇到卸载重装这些复杂的过程&#xff0c;但是我们保存的查询sql会跟随卸载Navicat而删除&#xff0c;为了节省时间省去不必要的麻烦&#xff0c;我们可以查到我们保…

基于STM32和人工智能的智能楼宇安防系统

目录 引言环境准备智能楼宇安防系统基础代码实现&#xff1a;实现智能楼宇安防系统 4.1 数据采集模块4.2 数据处理与分析4.3 控制系统4.4 用户界面与数据可视化应用场景&#xff1a;智能楼宇安防管理与优化问题解决方案与优化收尾与总结 1. 引言 随着物联网和人工智能技术的…

后端数据null前端统一显示成空

handleNullValues方法在封装请求接口返回数据时统一处理 // null 转 function handleNullValues(data) {// 使用递归处理多层嵌套的对象或数组function processItem(item) {if (Array.isArray(item)) {return item.map(processItem);} else if (typeof item object &&…

开源的语音合成项目-EdgeTTS,无需部署无需Key

前几天和大家分享了&#xff1a;全网爆火的AI语音合成工具-ChatTTS。 有很多小伙伴反应模型下载还有点麻烦~ 今天再给大家带来一款开源的语音合成 TTS 项目-EdgeTTS&#xff0c;相比ChatTTS&#xff0c;操作起来对小白更友好。 因为其底层是使用微软 Edge 的在线语音合成服务…

Java数据结构与算法——稀疏数组和队列

一、稀疏数组sparsearray数组 该二维数组的很多值是默认值0,因此记录了很多没有意义的数据&#xff0c;可以采用稀疏数组进行压缩 1.基本介绍: 当一个数组中大部分元素为0&#xff0c;或者为同一个值的数组时&#xff0c;可以使用稀疏数组来保存该数组。 稀疏数组的处理方法…

c++文件io,字符串io简单介绍

目录 c文件io 介绍 采用文件流对象操作文件的一般步骤 示例 注意点 利用字节流特性 字符串io 介绍 istringstream ostringstream 示例 c文件io 介绍 c根据文件内容的数据格式分为二进制文件和文本文件 基本上和c一样 c 标准库中有许多不同的标志 用于指定流对象的…

Ollama(docker)+ Open Webui(docker)+Comfyui

Windows 系统可以安装docker desktop 相对比较好用一点&#xff0c;其他的应该也可以 比如rancher desktop podman desktop 安装需要windows WSL 安装ollama docker docker run -d --gpusall -v D:\ollama:/root/.ollama -p 11434:11434 --name ollama ollama/ollama 这里…

CI /CD学习

CI/CD概述 CI/CD 是持续集成和持续交付/部署的缩写&#xff0c;旨在简化并加快软件开发生命周期。 持续集成&#xff08;CI&#xff09;是指自动且频繁地将代码更改集成到共享源代码存储库中的做法。持续交付和/或持续部署&#xff08;CD&#xff09;是一个由两部分组成的过程…

Paper Reading: PAMS:通过参数化最大尺度量化超分辨率

PAMS: Quantized Super-Resolution via Parameterized Max Scale PAMS&#xff1a;通过参数化最大尺度量化超分辨率, ECCV 2020 paper: https://arxiv.org/pdf/2011.04212.pdf GitHub: https://github.com/colorjam/PAMS 摘要 深度卷积神经网络&#xff08;DCNNs&#xff09;…

HumanPlus——斯坦福ALOHA团队开源的人形机器人:融合影子学习技术、RL、模仿学习

前言 今天只是一个平常的日子&#xff0c;不过看到了两篇文章 一篇是《半年冒出近百家新公司&#xff0c;「具身智能」也有春天》 我看完之后转发到朋友圈&#xff0c;并评论道&#xff1a;让机器人翻一万个后空翻&#xff0c;不如让机器人打好一个螺钉&#xff0c;毕竟在目前…

Flutter第十三弹 路由和导航

目标&#xff1a; 1.Flutter怎么创建路由&#xff1f; 2.怎么实现路由跳转&#xff1f;页面返回&#xff1f; 一、路由 1.1 什么是路由&#xff1f; 路由(Route)在移动开发中通常指页面&#xff08;Page&#xff09;&#xff0c;在Android中通常指一个Activity。所谓路由管…

什么是Linux挂载

首先先说一下在Linux中一切皆文件&#xff08;硬件设备也是文件&#xff09;&#xff0c;所有文件都是存放在以根目录为树形目录结构中&#xff1b;下面来说说一下什么是挂载 挂载&#xff1a;指的就是将设备文件中的顶级目录连接到 Linux 根目录下的某一目录&#xff08;最好是…

5.音视频基础 FLV

目录 简说FLV FLV Header FLV Body Tag Header ​编辑Tag Data Audio Data Video Data Script Data 简说FLV FLV格式可以包含音频、视频和文本数据&#xff0c;并且可以在网络上进行流媒体传输。优点是文件大小较小&#xff0c;压缩效率高&#xff0c;并且可以在较低…

深度解析ISO9001质量管理体系认证的核心优势

ISO9001质量管理体系认证是一项全球通用的标准&#xff0c;旨在帮助企业优化质量管理&#xff0c;提升市场竞争力。本文将详细解析ISO9001认证为企业带来的多重核心优势。 首先&#xff0c;ISO9001认证显著提升了企业的产品和服务质量。通过建立和实施系统化的质量管理流程&…

为数据安全护航,袋鼠云在数据分类分级上的探索实践

在大数据时代&#xff0c;数据具有多源异构的特性&#xff0c;且价值各异&#xff0c;企业需依据数据的重要性、价值指数等予以区分&#xff0c;以利采取不同的数据保护举措&#xff0c;避免数据泄露。故而&#xff0c;数据分类分级管理属于数据安全保护中极为重要的环节之一。…

小白速成AI大模型就看这份资源包

前言 在数字化浪潮席卷全球的今天&#xff0c;人工智能&#xff08;AI&#xff09;技术已成为推动社会进步的重要引擎。尤其是AI大模型&#xff0c;以其强大的数据处理能力和广泛的应用前景&#xff0c;吸引了无数人的目光。然而&#xff0c;对于初学者“小白”来说&#xff0…

面向AI时代的软件开发新范式

作为一名软件开发者&#xff0c;有幸站在了AI时代的风口浪尖。在这篇博客中&#xff0c;我将分享我的个人看法&#xff0c;一起走向AI时代软件开发新范式。 首先&#xff0c;我们要明确软件开发活动产生的各种制品&#xff0c;都是人类知识的载体&#xff0c;也是人类文明的高级…