BFS实现迷宫最短路径

news2024/11/13 9:02:11

         结合队列的知识利用 广度优先遍历,通过对能走的路径的记录以及对走过路径的标记,进行多条路搜查

一、理论基础

如下图的迷宫:

        选取所走方向(针对某一个位置)下,右,上,左,从起点(0,0)开始进行广度搜索,标记(0,1)走过,重复寻路,直到走到终点

如图:

        通过一个点找到所有与该顶点相连且能走的顶点,不停寻找,直到找到目的地或走完所有能走的点为止,图中可以看到

        任意一个顶点只有一个前驱,可以通过某种方式记录该顶点的前驱,一步步回到原点,并记录移动轨迹,最终得到从起点到终点最短路径的数组

步骤:

1)起点入队

2)队头出队,

3)找到所有与队头相连且为空地的点,将这些点都入队,并记录这些点的前驱

4)重复执行步骤2)3),直到队列为空

5)通过终点一步步回到前驱,最终回到终点,得到最短路径\

二、代码实现

C语言代码实现如下:

① 定义坐标结构体

typedef struct
{
	int row;	//行
    int col;	//列	
}Position;

② 定义队列结构及操作

typedef struct
{
	Position*queue;	//队列
    int front;		//头部
    int rear;		//尾部
    int cap;		//队列容量
}MyQueue;

//判断队列是否已满
bool IsEmpty(MyQueue*myqueue)
{
	if(myqueue->front==myqueue->rear)
        return true;
    else
        return false;
}
//弹出队头
Position PopFront(MyQueue*myqueue)
{
    Position p=myqueue->queue[myqueue->front];
    myqueue->front=(myqueue->front+1)%myqueue->cap;
    return p;
}
//插入队尾
void PushRear(MyQueue*myqueue,Postion p)
{
	myqueue->queue[myqueue->rear]=p;
    myqueue->rear=(myqueue->rear+1)%myqueue->cap;
}

③ 设置移动方向 


//移动方向
int orient[4][2]={
    {1,0},{0,1},{-1,0},{0,-1}
    //下    右     上     左
}

④ 开始广度寻路 

//0代表空地,1代表墙
void ShortestPath_BFS(int**maze,int maze_row,int maze_col,Position start,Position destination)
{
    //创建队列
	MyQueue*myqueue=CreatMyQueue(maze_row*maze*col);
	/*创建vt数组,标记某些点是否走过,0代表未走过,非0代表走过(1代表该点的前驱在该点下方,2代表该点的前驱在该点右边,
		3代表上,4代表左)*/
    int vt[maze_row][maze_col];
    memset(vt,0,sizeof(vt));	//对所有点初始化标记为未走过
    
    PushRear(myqueue,start);	//起点入队
    vt[start.row][start.col]=5;	//标记起点已走过,5代表起点位置
    
    while(!IsEmpty(myqueue))
    {
		Position temp=PopFront(myqueue);	//队头出队
        //找到与出队顶点相连且为空地的所有顶点入队
        for(int ori=0;ori<4;ori++)
        {
            //定义试探点
			int newRow=temp.row+orient[i][0];
            int newCol=temp.col+orient[i][1];
            
            //判断试探点是否能走
            if(newRow>=0&&newRow<maze_row&&newCol>=0&&newCol<maze_col&&maze[newRow][newCol]==0&&vt[newRow][newCol]==0)//不越界,且为空地,未走过
            {
                //该点入队
                Position p;
                p.row=newRow;
                p.col=newCol;
                PushRear(queue,p);
                //标记该点走过,记录该点前驱方向
                vt[newRow][newCol]=(ori+2)%4+1;
			}
		}
    }
    //定义路径数组
    Position*path=malloc(sizeof(Position)*maze_row*maze_col);
    int path_size=0;
    
    //通过终点回到前驱,直到回到起点,记录其移动轨迹
    int curRow=destination.row;
    int curCol=destination.col;
    while(vt[curRow][curCol]!=5)
    {
		path[path_size].row=curRow;
        path[path_size].col=curCol;
        path_size++;
        int ori=vt[curRow][curCol]-1;//前驱点相对于该点的方向在orient数组中的位置
        curRow+=orient[ori][0];		//前驱点的行
        curCol+=orient[ori][1];		//前驱点的列
    }
    //将起点位置存入路径数组
    path[path_size].row=start.row;
    path[path_size].col=start.col;
    path_size++;
    
    //展示从起点开始到终点的路径
	for(int i=path_size-1;i>=0;i--)
    {
		printf("(%d,%d)"path[i].row,path[i].col);
        if(i!=0)
            printf("->");
    }
}

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

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

相关文章

客户在哪儿AI——做真正管用的大客户获客方案

我们的目标是要打造一个真正“管用”的ToB大客户获客方案。以下是两个100%真实的案例&#xff0c;所有数据均为真实经营数据。一个是证明客户在哪儿AI对市场工作的颠覆性提升&#xff0c;另一个是证明客户在哪儿AI对决策层和销售工作的颠覆性提升。 客户在哪儿AI生产的是企业全…

C++模板——泛型编程

目录 1. 什么是泛型编程 2. 函数模板 2.1 定义格式 2.2 实例化及原理 2.3 参数匹配原则 3. 类模板 3.1 定义格式 3.2 实例化 4. 非类型模板参数 5. 模板的特化 5.1 概念 5.2 函数模板和类模板特化 6. 模板的分离编译 1. 什么是泛型编程 如何实现一个通用的加…

Windows下Pytorch入门深度学习环境安装与配置(CPU版本)

Windows下Pytorch入门深度学习环境安装与配置&#xff08;CPU版本&#xff09; 一、安装过程中各个软件的作用&#xff08;一&#xff09;Python&#xff08;二&#xff09;库 / 包 / package / library&#xff08;三&#xff09;PyTorch / Tensorflow&#xff08;四&#xff…

详解yolov5和yolov8以及目标检测相关面试

一、与yoloV4相比&#xff0c;yoloV5的改进 输入端&#xff1a;在模型训练阶段&#xff0c;使用了Mosaic数据增强、自适应锚框计算、自适应图片缩放基准网络&#xff1a;使用了FOCUS结构和CSP结构Neck网络&#xff1a;在Backbone和最后的Head输出层之间插入FPN_PAN结构Head输出…

计算机二级题--文件 章节

之前写的有文件全部的知识点&#xff0c;这一篇主要针对计算机二级真题的整理。 需要备考计算机二级的小伙伴们先收藏起来吧。整理不易&#xff0c;不过有帮助记得点赞哦 1.相关概念考点&#xff1a; 1.文件指针指向的是文件缓冲区的位置&#xff0c;不是文件在读位置。 2.…

儿童洗衣机哪个牌子好?五大爆款机型倾情分享

在当今繁忙的生活中&#xff0c;儿童洗衣机已成为我们日常生活中不可或缺的家电。但是&#xff0c;面对市场上众多品牌的儿童洗衣机&#xff0c;那么&#xff0c;到底儿童洗衣机哪个牌子好&#xff1f;本次我将在这篇文章中探讨儿童洗衣机的选购策略&#xff0c;以帮助大家找到…

记录unraid docker更新的域名

背景&#xff1a;级联 一、安装内容 unraid更新docker&#xff0c;之前一直失败&#xff0c;修改网络后可以进行安装。 二、查看域名 查看域名&#xff0c;发现是走github的&#xff0c;怪不得有一些docker无法正常更新 三、解决方法 更改代理&#xff0c;这里为unraid的…

智慧教育解决方案

1. 智慧教育解决方案概述 智慧教育解决方案旨在通过教育改革实现四个转变&#xff1a;从以教为主到以学为主&#xff0c;从专业教育到通识与专业教育结合&#xff0c;从课堂教育到课内外结合&#xff0c;以及从结果评价到过程与结果评价结合。 2. 教育三维目标 教育三维目标…

避免工件精度受损:精准调整滚珠丝杆状态!

滚珠丝杆作为一种常用的传动装置&#xff0c;经过长期使用或者维护不当的情况下有时会发生弯曲或变形。弯曲不仅会对滚珠丝杆的精度和寿命造成影响&#xff0c;而且还会对整个机器系统的工作效率和安全性产生影响。那么&#xff0c;应该如何要避免滚珠丝杆弯曲对工件的影响呢&a…

Java数据结构与算法--链表(Linked List)

博客主页&#xff1a;誓则盟约系列专栏&#xff1a;Java SE关注博主&#xff0c;后期持续更新系列文章如果有错误感谢请大家批评指出&#xff0c;及时修改感谢大家点赞&#x1f44d;收藏⭐评论✍ 深入了解链表&#xff1a; 链表是一种常见的数据结构&#xff0c;它由一系列节点…

【SOC 芯片设计 DFT 学习专栏 -- DFT DRC规则检查】

请阅读【嵌入式及芯片开发学必备专栏】 请阅读【芯片设计 DFT 学习系列 】 如有侵权&#xff0c;请联系删除 转自&#xff1a; 芯爵ChipLord 2024年07月10日 12:00 浙江 文章目录 概述DRC的概念Tessent DRC检查的概述时钟相关检查扫描相关检查BIST规则检查预DFT时钟规则检查 …

zh echarts样式

记录一下&#xff1a; 一个图的配置 在echarts官网demo界面 option {title: {text: },legend: {data: [xxx前, xxx后]},radar: {// shape: circle,name: {// 雷达图各类别名称文本颜色textStyle: {color: #000,fontSize: 16}},indicator: [{ name: 完整性, max: 1 },{ name:…

ByteBuffer调试工具类

一个可以形象展示ByteBuffer内容的方法&#xff0c;便于调试 package com.example.netty;import java.nio.ByteBuffer;public class ByteBufferUtil {/*** 打印ByteBuffer的内容&#xff0c;以十六进制和ASCII字符的形式展示。** param buffer 要展示的ByteBuffer*/public sta…

Java全栈课程之Linux——用户组管理

每个用户都有一个用户组&#xff0c;系统可以对一个用户组中的所有用户进行集中管理。不同Linux 系统对用户组的规定有所不同&#xff0c;如Linux下的用户属于与它同名的用户组&#xff0c;这个用户组在创建用户时同时创建。 用户组的管理涉及用户组的添加、删除和修改。组的增…

Jenkins持续集成软件

1.什么是jenkins? jenkins是一个开源软件项目&#xff0c;是基于Java开发的一种持续集成工具&#xff0c;用于监控持续重复的工作&#xff0c;提供一个开放易用的软件平台&#xff0c;时软件项目可以进行持续集成。 通俗来说&#xff1a;Jenkins软件就是自动拉取git远程仓库所…

03--KVM虚拟化

前言&#xff1a;这里开始涉及到云计算内容&#xff0c;虚拟化使云计算发展&#xff0c;云计算推动虚拟化进步&#xff0c;两者相辅相成&#xff0c;这一章总结一下kvm虚拟化的解决方案。 1、基础概念 1.1、云计算 以前要完成信息处理, 是需要在一个客观存在的计算机上完成的…

永劫无间游戏辅助攻略:2024阵容搭配攻略大全!云手机辅助!

《永劫无间》是一款备受玩家喜爱的动作类游戏&#xff0c;其丰富的角色选择和多样的技能搭配让玩家在战斗中体验到了极大的乐趣。然而&#xff0c;要在竞争激烈的战场上脱颖而出&#xff0c;仅仅依靠基础的游戏理解是远远不够的。为了帮助广大玩家提升战斗力&#xff0c;本文将…

安防巡检机器人:守护安全的智能卫士

安防巡检机器人&#xff0c;作为机器人技术在安防领域的杰出应用&#xff0c;是一种集自主导航、智能巡检、环境监测、远程监控等多功能于一体的智能装备。这些机器人通过集成先进的传感器、高清摄像头、智能算法和导航系统等模块&#xff0c;实现了全天候、全方位、自主化的安…

芒果TV大模型来袭 | AI如何重塑微短剧制作未来?

在数字化浪潮推动下&#xff0c;7月23日&#xff0c;芒果TV大模型正式通过生成式人工智能大语言模型备案审核&#xff0c;并预计2024年内可应用于微短剧生产&#xff0c;可支撑节目创意策划、内容创作和生成、角色拟人对话、生成式内容推荐等行业应用场景。 市场对高质量内容的…