广度优先遍历解决迷宫问题

学习贺利坚老师课程

数据结构例程——迷宫问题(用队列)_数据结构用队列求解迷宫问题-CSDN博客

本人详细解析博客

广度优先遍历解决迷宫问题_迷宫求解c语言深度广度遍历-CSDN博客

版本更新日志

V1.0: 模仿详细解析博客, 基础上, 命名优化, 规范书写, 加上手动输入起点和终点, 地图可视化

V1.0

main.cpp里面的子函数与结构

节点方向结构

//定义方块的信息,包括坐标和回溯需要的信息
typedef struct
{int Box_x;  //方块在地图中的位置int Box_y;int previous_location;    //方块在上一个方块在队列中的数组下标
}Box;

记录路线队列

//定义队列的数据结构
typedef struct
{Box route_data[MaxSize];int box_front,box_rear;//队首和队尾指针}Route_queue;

广度优先遍历寻路,并记录路线的子函数

bool Breadth_first_explorepath(int start_X,int start_Y,int export_X,int export_Y);

输出可解最优路线

void print_route(Route_queue Backtracking_path, int recall);

输出可视化地图

void show_maper(void);

输入起点和终点坐标函数

void Enter_start_end(int &start_pointX, int &start_pointY,int &export_pointX,int &export_pointY);

主函数调用

int main()
{bool Find_exit;int start_pointX;int start_pointY;int export_pointX;int export_pointY;show_maper();Enter_start_end(start_pointX,start_pointY,export_pointX,export_pointY);Find_exit = Breadth_first_explorepath(start_pointX,start_pointY,export_pointX,export_pointY);if(Find_exit == 1){printf("\n恭喜你,找到出口!\n");}else{printf("\n很抱歉,没能找到出口!\n");}return 0;}

main.cpp源码

//头文件
#include <stdio.h>
//定义运算规模
#define MaxSize 100
//定义迷宫规模
#define X_length 8#define Y_length 8//用数组来描述迷宫
int maper[X_length+2][Y_length+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,1,0,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 Box_x;  //方块在地图中的位置int Box_y;int previous_location;    //方块在上一个方块在队列中的数组下标
}Box;//定义队列的数据结构
typedef struct
{Box route_data[MaxSize];int box_front,box_rear;//队首和队尾指针}Route_queue;void print_route(Route_queue Backtracking_path, int recall);
bool Breadth_first_explorepath(int start_X,int start_Y,int export_X,int export_Y);
void show_maper(void);
void Enter_start_end(int &start_pointX, int &start_pointY,int &export_pointX,int &export_pointY);void print_route(Route_queue Backtracking_path, int recall)
{//回溯,然后标记路径,输出最优路线坐标int mark_front = recall;  // 记录回溯的序号int mark;  //标记序号int mark_number;    //标记的数量printf("\n");//反向找到最短路径, 将该路径上的方块的pre成员置-1do{mark = mark_front;//继续向前回溯mark_front = Backtracking_path.route_data[mark_front].previous_location;Backtracking_path.route_data[mark].previous_location = -1;}while(mark_front != 0);printf("\n迷宫路径如下:\n");//正向计数路线个数mark_number = 0;//正向计数序号mark = 0;while(mark <= recall){//如果数组元素的回溯指针为-1,则将其元素坐标输出if(Backtracking_path.route_data[mark].previous_location == -1){mark_number++;printf("\t(%d,%d)",Backtracking_path.route_data[mark].Box_x,Backtracking_path.route_data[mark].Box_y);if(mark_number % 5 == 0){printf("\n");     //每输出五个方块后换行}}mark++;}printf("\n");
}//思路: 此层级节点, 周围能走通的节点,全部加入队列, 加入队列的节点,记录上一层级节点的队列坐标
bool Breadth_first_explorepath(int start_X,int start_Y,int export_X,int export_Y)
{int visit_x,visit_y;   //定义访问坐标变量bool Isfind_next;   //是否找到下一个可探索点int Explore_direction;  //定义寻找方向Route_queue Explorer;   //探索者队列Explorer.box_front = Explorer.box_rear = -1; //队首队尾指向-1,方便后续累加Explorer.box_rear++;//降落起点,起点加入路线Explorer.route_data[Explorer.box_rear].Box_x = start_X;Explorer.route_data[Explorer.box_rear].Box_y = start_Y;Explorer.route_data[Explorer.box_rear].previous_location = -1;//起点,置为-1maper[start_X][start_Y] = -1;Isfind_next = 0;//队列遍历完或找到终点,则跳出while(Explorer.box_front != Explorer.box_rear && Isfind_next != 1){//出队节点,探索其周围可走的点,然后加入队列Explorer.box_front++;visit_x = Explorer.route_data[Explorer.box_front].Box_x;visit_y = Explorer.route_data[Explorer.box_front].Box_y;if(visit_x == export_X && visit_y == export_Y){//符合则,找到终点Isfind_next = 1;//调用printf_route函数输出路径print_route(Explorer, Explorer.box_front);return 1;}//如果没找到, 则扫描队首节点,可走节点, 然后加入队尾,直到找到为止for(Explore_direction = 0; Explore_direction < 4; Explore_direction++){switch(Explore_direction){case 0: //上visit_x = Explorer.route_data[Explorer.box_front].Box_x-1;visit_y = Explorer.route_data[Explorer.box_front].Box_y;break;case 1: //右visit_x = Explorer.route_data[Explorer.box_front].Box_x;visit_y = Explorer.route_data[Explorer.box_front].Box_y+1;break;case 2: //下visit_x = Explorer.route_data[Explorer.box_front].Box_x+1;visit_y = Explorer.route_data[Explorer.box_front].Box_y;break;case 3: //左visit_x = Explorer.route_data[Explorer.box_front].Box_x;visit_y = Explorer.route_data[Explorer.box_front].Box_y-1;break;}//如果对应的方向可走,则进行入队操作if(maper[visit_x][visit_y] == 0){Explorer.box_rear++;Explorer.route_data[Explorer.box_rear].Box_x = visit_x;Explorer.route_data[Explorer.box_rear].Box_y = visit_y;//队首和队尾相呼应 ,队尾赋值队首的回溯数据Explorer.route_data[Explorer.box_rear].previous_location = Explorer.box_front;//对应地图坐标被占用,记作-1maper[visit_x][visit_y] = -1;}}}//当访问了,所有能到达的所有节点,仍未找到,则跳出,返回0return 0;
}void show_maper(void)
{for(int display_x = 1; display_x < X_length+1;display_x++){if(display_x == 1){printf(" →Y");printf("\t");for(int display_y = 1; display_y < Y_length+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_length+1;display_y++){printf("%d ",maper[display_x][display_y]);}printf("\n");}}void Enter_start_end(int &start_pointX, int &start_pointY,int &export_pointX,int &export_pointY)
{printf("\n请输入初始地址:\n(例如:1,1)");scanf("%d, %d", &start_pointX, &start_pointY);printf("\n请输入出口地址:\n(例如:8,8)");scanf("%d, %d", &export_pointX, &export_pointY);
}int main()
{bool Find_exit;int start_pointX;int start_pointY;int export_pointX;int export_pointY;show_maper();Enter_start_end(start_pointX,start_pointY,export_pointX,export_pointY);Find_exit = Breadth_first_explorepath(start_pointX,start_pointY,export_pointX,export_pointY);if(Find_exit == 1){printf("\n恭喜你,找到出口!\n");}else{printf("\n很抱歉,没能找到出口!\n");}return 0;}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

改变AI历史的Transformer是如何帮助LLM大模型工作的?看图解密Transformer原理,看不懂算我输!

在过去的几年里&#xff0c;大型语言模型(LLM)的出现&#xff0c;为长达数十年的智能机器构建的探索中带来了巨大的飞跃。 这项基于试图模拟人类大脑的研究技术&#xff0c;也在近几年催生了一个新领域——Generative AI 生成式人工智能&#xff0c;简单理解就是可以 通过模仿…

llama-3 本地化部署实验

国产大模型的API 有限&#xff0c;编写langchain 应用问题很多。使用openai 总是遇到网络问题&#xff0c;尝试使用ollama在本地运行llama-3。结果异常简单。效果不错。llama-3 的推理能力感觉比openai 的GPT-3.5 好。 Ollama 下载 官网&#xff1a;https://ollama.com/downl…

基于GYM环境的DQN简单实现

1. Gym的安装 两种安装方式&#xff1a; https://zhuanlan.zhihu.com/p/483132488 注意&#xff1a;Gym版本太新了&#xff0c;有些APIs不兼容&#xff0c;可以考虑低版本的Gym pip install gym0.19.0 2. 基于CartPole-v0项目 参考&#xff1a; DQN代码逐行详解-CSDN博…

武汉凯迪正大—漆包圆线软化击穿试验仪 漆包线检测仪器

产品功能 武汉凯迪正大电气有限公司生产KDZD-JC软化击穿试验仪用于检测3.00mm及以下漆包线在热状态下漆膜软化后的绝缘性能&#xff0c;根据设定的预热温度、试验时间、仪器自动完成对试样的预加热、加负荷、加试验电压&#xff0c;达到试验时间或试样被击穿时即卸负荷&#x…

基于ARM的通用的Qt移植思路

文章目录 实验环境介绍一、确认Qt版本二、确认交叉编译工具链三、配置Qt3.1、修改qmake.conf3.2、创建autoConfig.sh配置文件 四、编译安装Qt五、移植Qt安装目录六、配置Qt creator6.1、配置qmake6.2、配置GCC编译器6.3、配置G编译器6.4、配置编译器套件6.5、创建应用 七、总结…

【Linux杂货铺】Linux学习之路:期末总结篇1

第一章 什么是Linux? Linux 是 UNIX 操作系统的一个克隆&#xff1b;它由林纳斯 本纳第克特 托瓦兹从零开始编写&#xff0c;并在网络上众多松散的黑客团队的帮助下得以发展和完善&#xff1b;它遵从可移植操作系统接口&#xff08;POSIX&#xff09;标准和单一 UNIX 规范…

PLC数据采集案例

--------天津三石峰科技案例分享 项目介绍 项目背景 本项目为天津某钢铁集团下数字化改造项目&#xff0c;主要解决天津大型钢厂加氢站数字化改造过程中遇到的数据采集需求。项目难点PLC已经在运行了&#xff0c;需要采集里面数据&#xff0c;不修改程序&#xff0c;不影响P…

智能农业技术:物联网、无人机与机器人引领的绿色革命

在这个信息化与智能化并行的时代&#xff0c;农业——这个最古老的人类产业&#xff0c;正经历一场前所未有的科技变革。物联网&#xff08;IoT&#xff09;、无人机&#xff08;UAV&#xff09;和机器人技术的深度融合&#xff0c;正逐步构建起一个高效、精准、可持续的现代农…

博物馆环境监测系统:实际操作中的文物守护者

在博物馆的静谧空间中&#xff0c;每一件文物都承载着历史的重量和文化的精髓。为了确保文物的安全与完整&#xff0c;博物馆环境监测系统应运而生&#xff0c;它如同一位细心的守护者&#xff0c;时刻关注着文物的“健康”状况。本文将从实际操作的角度出发&#xff0c;探讨如…

百度ueditor如何修改图片的保存位置

背景 编辑器的保存图片是设置有默认规则的&#xff0c;但是服务器上一般会把图片路径设置为软连接&#xff0c;所以我就需要更改编辑器保存图片的路径&#xff0c;要不然&#xff0c;每次有新的部署&#xff0c;上一次上传的图片就会失效。先来看看编辑器默认的保存路径吧&…

大数据之MYSQL基础知识总结:

一.sql语言语法特点&#xff1a; 1.对关键字的大小写不敏感 2.sql语句可以单行或者多行书写,以分行结束 3. 注释&#xff1a;-- 这是注释 &#xff0c; #这是注释 &#xff0c; 多行注释 &#xff1a;/*第一行 第二行 */ 二. 数据库分类&#xff1a; 1.关系型数据库&#xff0…

MoneyPrinterPlus:AI自动短视频生成工具-微软云配置详解

MoneyPrinterPlus可以使用大模型自动生成短视频&#xff0c;我们可以借助Azure提供的语音服务来实现语音合成和语音识别的功能。 Azure的语音服务应该是我用过的效果最好的服务了&#xff0c;微软还得是微软。 很多小伙伴可能不知道应该如何配置&#xff0c;这里给大家提供一…

软考架构师考试内容

软考系统架构设计师考试是中国计算机技术与软件专业技术资格&#xff08;水平&#xff09;考试&#xff08;简称软考&#xff09;中的一项高级资格考试&#xff0c;旨在评估考生是否具备系统架构设计的能力。根据提供的参考资料&#xff0c;考试内容主要包括以下几个方面&#…

Git怎么下载并且使用?

Git是一个分布式版本控制系统&#xff0c;可以记录和管理项目的变更。 下载Git&#xff1a; 打开Git的官方网站&#xff1a;https://git-scm.com/downloads根据你使用的操作系统选择对应的下载链接。如果你使用的是Windows&#xff0c;点击“Windows”按钮&#xff1b;如果你…

基于盲信号处理的声音分离——最小化增益的ICA算法

基于最小化增益的ICA算法的算法是依据混合信号经过盲信号分离会产生一定的噪声&#xff0c;为了使得分离后的信号与原信号的比值最小时&#xff0c;叫做增益最小。当增益越小时&#xff0c;分离后噪声越小&#xff0c;分离信号越接近原信号&#xff0c;分离算法的效果越好。这是…

激励视频广告的eCPM更高,每天的展示频次有限制吗?

在APP发展初期&#xff0c;由于DUA量级有限&#xff0c;所需的广告资源比较少&#xff0c;往往接入1-2家广告平台就能满足APP用户每日需要的广告展示量。而随着APP用户规模的扩大、广告场景的不断丰富&#xff0c;开发者要提升APP整体广告变现收益&#xff0c;一是可以尽可能多…

uView 2.0:uni-app生态的利剑出鞘,引领UI框架新纪元

引言 随着移动互联网的快速发展&#xff0c;跨平台应用开发成为了开发者们关注的焦点。uni-app&#xff0c;一个基于Vue.js的跨平台应用开发框架&#xff0c;因其高效、易用的特性而广受欢迎。在uni-app的生态系统中&#xff0c;UI框架的选择对于开发者而言至关重要。今天&…

云安全是全球组织最优先考虑的问题

关注公众号网络研究观&#xff0c;阅读内容全文。 随着越来越多的数据泄露和应用程序蔓延使防御变得更加复杂&#xff0c;云安全已成为全球组织关注的重点。 这是泰雷兹对全球 3,000 名 IT 安全专业人士进行的一项调查的结果&#xff0c;调查发现三分之一的受访者将云安全列为…

【YOLOv5/v7改进系列】引入RT-DETR的RepC3

一、导言 RT-DETR&#xff08;Real-Time Detection Transformer&#xff09;是一种针对实时目标检测任务的创新方法&#xff0c;它旨在克服YOLO系列和其他基于Transformer的检测器存在的局限性。RT-DETR的主要优点包括&#xff1a; 无NMS&#xff08;非极大值抑制&#xff09;…