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

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

相关文章

线上Java OOM问题定位与解决方案超详细解析

《线上JavaOOM问题定位与解决方案超详细解析》OOM是JVM抛出的错误,表示内存分配失败,:本文主要介绍线上JavaOOM问题定位与解决方案的相关资料,文中通过代码介绍的非常详细,需要的朋... 目录一、OOM问题核心认知1.1 OOM定义与技术定位1.2 OOM常见类型及技术特征二、OOM问题定位工具

C++右移运算符的一个小坑及解决

《C++右移运算符的一个小坑及解决》文章指出右移运算符处理负数时左侧补1导致死循环,与除法行为不同,强调需注意补码机制以正确统计二进制1的个数... 目录我遇到了这么一个www.chinasem.cn函数由此可以看到也很好理解总结我遇到了这么一个函数template<typename T>unsigned

PHP应用中处理限流和API节流的最佳实践

《PHP应用中处理限流和API节流的最佳实践》限流和API节流对于确保Web应用程序的可靠性、安全性和可扩展性至关重要,本文将详细介绍PHP应用中处理限流和API节流的最佳实践,下面就来和小编一起学习... 目录限流的重要性在 php 中实施限流的最佳实践使用集中式存储进行状态管理(如 Redis)采用滑动

Vue3绑定props默认值问题

《Vue3绑定props默认值问题》使用Vue3的defineProps配合TypeScript的interface定义props类型,并通过withDefaults设置默认值,使组件能安全访问传入的... 目录前言步骤步骤1:使用 defineProps 定义 Props步骤2:设置默认值总结前言使用T

深度解析Python中递归下降解析器的原理与实现

《深度解析Python中递归下降解析器的原理与实现》在编译器设计、配置文件处理和数据转换领域,递归下降解析器是最常用且最直观的解析技术,本文将详细介绍递归下降解析器的原理与实现,感兴趣的小伙伴可以跟随... 目录引言:解析器的核心价值一、递归下降解析器基础1.1 核心概念解析1.2 基本架构二、简单算术表达

深度解析Java @Serial 注解及常见错误案例

《深度解析Java@Serial注解及常见错误案例》Java14引入@Serial注解,用于编译时校验序列化成员,替代传统方式解决运行时错误,适用于Serializable类的方法/字段,需注意签... 目录Java @Serial 注解深度解析1. 注解本质2. 核心作用(1) 主要用途(2) 适用位置3

深入浅出Spring中的@Autowired自动注入的工作原理及实践应用

《深入浅出Spring中的@Autowired自动注入的工作原理及实践应用》在Spring框架的学习旅程中,@Autowired无疑是一个高频出现却又让初学者头疼的注解,它看似简单,却蕴含着Sprin... 目录深入浅出Spring中的@Autowired:自动注入的奥秘什么是依赖注入?@Autowired

Java MCP 的鉴权深度解析

《JavaMCP的鉴权深度解析》文章介绍JavaMCP鉴权的实现方式,指出客户端可通过queryString、header或env传递鉴权信息,服务器端支持工具单独鉴权、过滤器集中鉴权及启动时鉴权... 目录一、MCP Client 侧(负责传递,比较简单)(1)常见的 mcpServers json 配置

504 Gateway Timeout网关超时的根源及完美解决方法

《504GatewayTimeout网关超时的根源及完美解决方法》在日常开发和运维过程中,504GatewayTimeout错误是常见的网络问题之一,尤其是在使用反向代理(如Nginx)或... 目录引言为什么会出现 504 错误?1. 探索 504 Gateway Timeout 错误的根源 1.1 后端

Web服务器-Nginx-高并发问题

《Web服务器-Nginx-高并发问题》Nginx通过事件驱动、I/O多路复用和异步非阻塞技术高效处理高并发,结合动静分离和限流策略,提升性能与稳定性... 目录前言一、架构1. 原生多进程架构2. 事件驱动模型3. IO多路复用4. 异步非阻塞 I/O5. Nginx高并发配置实战二、动静分离1. 职责2