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

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

相关文章

中文分词jieba库的使用与实景应用(一)

知识星球:https://articles.zsxq.com/id_fxvgc803qmr2.html 目录 一.定义: 精确模式(默认模式): 全模式: 搜索引擎模式: paddle 模式(基于深度学习的分词模式): 二 自定义词典 三.文本解析   调整词出现的频率 四. 关键词提取 A. 基于TF-IDF算法的关键词提取 B. 基于TextRank算法的关键词提取

水位雨量在线监测系统概述及应用介绍

在当今社会,随着科技的飞速发展,各种智能监测系统已成为保障公共安全、促进资源管理和环境保护的重要工具。其中,水位雨量在线监测系统作为自然灾害预警、水资源管理及水利工程运行的关键技术,其重要性不言而喻。 一、水位雨量在线监测系统的基本原理 水位雨量在线监测系统主要由数据采集单元、数据传输网络、数据处理中心及用户终端四大部分构成,形成了一个完整的闭环系统。 数据采集单元:这是系统的“眼睛”,

好题——hdu2522(小数问题:求1/n的第一个循环节)

好喜欢这题,第一次做小数问题,一开始真心没思路,然后参考了网上的一些资料。 知识点***********************************无限不循环小数即无理数,不能写作两整数之比*****************************(一开始没想到,小学没学好) 此题1/n肯定是一个有限循环小数,了解这些后就能做此题了。 按照除法的机制,用一个函数表示出来就可以了,代码如下

hdu1043(八数码问题,广搜 + hash(实现状态压缩) )

利用康拓展开将一个排列映射成一个自然数,然后就变成了普通的广搜题。 #include<iostream>#include<algorithm>#include<string>#include<stack>#include<queue>#include<map>#include<stdio.h>#include<stdlib.h>#include<ctype.h>#inclu

hdu1180(广搜+优先队列)

此题要求最少到达目标点T的最短时间,所以我选择了广度优先搜索,并且要用到优先队列。 另外此题注意点较多,比如说可以在某个点停留,我wa了好多两次,就是因为忽略了这一点,然后参考了大神的思想,然后经过反复修改才AC的 这是我的代码 #include<iostream>#include<algorithm>#include<string>#include<stack>#include<

csu 1446 Problem J Modified LCS (扩展欧几里得算法的简单应用)

这是一道扩展欧几里得算法的简单应用题,这题是在湖南多校训练赛中队友ac的一道题,在比赛之后请教了队友,然后自己把它a掉 这也是自己独自做扩展欧几里得算法的题目 题意:把题意转变下就变成了:求d1*x - d2*y = f2 - f1的解,很明显用exgcd来解 下面介绍一下exgcd的一些知识点:求ax + by = c的解 一、首先求ax + by = gcd(a,b)的解 这个

hdu1394(线段树点更新的应用)

题意:求一个序列经过一定的操作得到的序列的最小逆序数 这题会用到逆序数的一个性质,在0到n-1这些数字组成的乱序排列,将第一个数字A移到最后一位,得到的逆序数为res-a+(n-a-1) 知道上面的知识点后,可以用暴力来解 代码如下: #include<iostream>#include<algorithm>#include<cstring>#include<stack>#in

zoj3820(树的直径的应用)

题意:在一颗树上找两个点,使得所有点到选择与其更近的一个点的距离的最大值最小。 思路:如果是选择一个点的话,那么点就是直径的中点。现在考虑两个点的情况,先求树的直径,再把直径最中间的边去掉,再求剩下的两个子树中直径的中点。 代码如下: #include <stdio.h>#include <string.h>#include <algorithm>#include <map>#

如何解决线上平台抽佣高 线下门店客流少的痛点!

目前,许多传统零售店铺正遭遇客源下降的难题。尽管广告推广能带来一定的客流,但其费用昂贵。鉴于此,众多零售商纷纷选择加入像美团、饿了么和抖音这样的大型在线平台,但这些平台的高佣金率导致了利润的大幅缩水。在这样的市场环境下,商家之间的合作网络逐渐成为一种有效的解决方案,通过资源和客户基础的共享,实现共同的利益增长。 以最近在上海兴起的一个跨行业合作平台为例,该平台融合了环保消费积分系统,在短

购买磨轮平衡机时应该注意什么问题和技巧

在购买磨轮平衡机时,您应该注意以下几个关键点: 平衡精度 平衡精度是衡量平衡机性能的核心指标,直接影响到不平衡量的检测与校准的准确性,从而决定磨轮的振动和噪声水平。高精度的平衡机能显著减少振动和噪声,提高磨削加工的精度。 转速范围 宽广的转速范围意味着平衡机能够处理更多种类的磨轮,适应不同的工作条件和规格要求。 振动监测能力 振动监测能力是评估平衡机性能的重要因素。通过传感器实时监