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

2024-06-20 03:12

本文主要是介绍深度优先遍历解决迷宫问题(顺序栈的应用),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

学习贺利坚老师课程

数据结构例程——迷宫问题(用栈结构)_数据结构迷宫问题-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("此路有解!");}elseif(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;//路线栈顶节点,方向置空 为-1depth_route.data[depth_route.top].direction = -1;//如果通过上述验证,则此节点已经加入路线,占用地图,标记为 -1mapper[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("此路有解!");}elseif(result == 0){printf("此路无解!");}return 0;
}

这篇关于深度优先遍历解决迷宫问题(顺序栈的应用)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1076937

相关文章

Windows环境下解决Matplotlib中文字体显示问题的详细教程

《Windows环境下解决Matplotlib中文字体显示问题的详细教程》本文详细介绍了在Windows下解决Matplotlib中文显示问题的方法,包括安装字体、更新缓存、配置文件设置及编码調整,并... 目录引言问题分析解决方案详解1. 检查系统已安装字体2. 手动添加中文字体(以SimHei为例)步骤

Redis中Stream详解及应用小结

《Redis中Stream详解及应用小结》RedisStreams是Redis5.0引入的新功能,提供了一种类似于传统消息队列的机制,但具有更高的灵活性和可扩展性,本文给大家介绍Redis中Strea... 目录1. Redis Stream 概述2. Redis Stream 的基本操作2.1. XADD

SpringSecurity整合redission序列化问题小结(最新整理)

《SpringSecurity整合redission序列化问题小结(最新整理)》文章详解SpringSecurity整合Redisson时的序列化问题,指出需排除官方Jackson依赖,通过自定义反序... 目录1. 前言2. Redission配置2.1 RedissonProperties2.2 Red

nginx 负载均衡配置及如何解决重复登录问题

《nginx负载均衡配置及如何解决重复登录问题》文章详解Nginx源码安装与Docker部署,介绍四层/七层代理区别及负载均衡策略,通过ip_hash解决重复登录问题,对nginx负载均衡配置及如何... 目录一:源码安装:1.配置编译参数2.编译3.编译安装 二,四层代理和七层代理区别1.二者混合使用举例

JSONArray在Java中的应用操作实例

《JSONArray在Java中的应用操作实例》JSONArray是org.json库用于处理JSON数组的类,可将Java对象(Map/List)转换为JSON格式,提供增删改查等操作,适用于前后端... 目录1. jsONArray定义与功能1.1 JSONArray概念阐释1.1.1 什么是JSONA

nginx -t、nginx -s stop 和 nginx -s reload 命令的详细解析(结合应用场景)

《nginx-t、nginx-sstop和nginx-sreload命令的详细解析(结合应用场景)》本文解析Nginx的-t、-sstop、-sreload命令,分别用于配置语法检... 以下是关于 nginx -t、nginx -s stop 和 nginx -s reload 命令的详细解析,结合实际应

Java中读取YAML文件配置信息常见问题及解决方法

《Java中读取YAML文件配置信息常见问题及解决方法》:本文主要介绍Java中读取YAML文件配置信息常见问题及解决方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要... 目录1 使用Spring Boot的@ConfigurationProperties2. 使用@Valu

浅析Spring如何控制Bean的加载顺序

《浅析Spring如何控制Bean的加载顺序》在大多数情况下,我们不需要手动控制Bean的加载顺序,因为Spring的IoC容器足够智能,但在某些特殊场景下,这种隐式的依赖关系可能不存在,下面我们就来... 目录核心原则:依赖驱动加载手动控制 Bean 加载顺序的方法方法 1:使用@DependsOn(最直

PostgreSQL的扩展dict_int应用案例解析

《PostgreSQL的扩展dict_int应用案例解析》dict_int扩展为PostgreSQL提供了专业的整数文本处理能力,特别适合需要精确处理数字内容的搜索场景,本文给大家介绍PostgreS... 目录PostgreSQL的扩展dict_int一、扩展概述二、核心功能三、安装与启用四、字典配置方法

SQL Server配置管理器无法打开的四种解决方法

《SQLServer配置管理器无法打开的四种解决方法》本文总结了SQLServer配置管理器无法打开的四种解决方法,文中通过图文示例介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的... 目录方法一:桌面图标进入方法二:运行窗口进入检查版本号对照表php方法三:查找文件路径方法四:检查 S