广度寻路算法

迷宫寻路之广度优先算法(bfs) 简短介绍了深度优先算法(df)用于迷宫寻路,但深度优先算法具有随机性,而且找到的路不一定是最短的路径。上文括号里的参数,例如(3,1,4),3行,1为列,4为到达的最短步数。这里我们从(0,0)出发到到(2,2)位置,最少需要4步。if (q->front > q->rear) { // 队列为空时重置。//maze 表示迷宫,0表示可以通行,1表示不可以通行。//这里是path的索引。通过标注,我们可以清楚的知道最短路径。下面是通过c写的相关实现。// 队列结构用于BFS。// 检查队列是否为空。 阅读详情

1、广度寻路规则
与深度寻路沿着某一方向走不同的是,广度寻路将当前层所有可能要走的路都列举出来并遍历,然后接着下一层遍历,最后谁先走到终点谁就是最短路径。
2、程序实现
利用vector容器实现。还是定义起始点与终点,将初始点标记已经走过。接着定义当前点的位置与将要走的位置,并为这些点建立vector容器。上、下、左、右四个方向,对应的row+±-或col+±-。做一个判断当前点是否能走,不能走的有2种情况:1、当前点已经走过或者墙。2、超出地图范围。
3、具体程序如下:

// 广度寻路算法.cpp : 定义控制台应用程序的入口点。
/*
广度寻路算法是:将所有可能的路都列举出来,然后一层一层去走,谁先到谁就是最短路径
广度优先寻路算法实际上是对一个地图上所有可通行的点的遍历从而找出一条最短路径
*/

#include "stdafx.h"
#include<vector>
#include<iostream>
using namespace std;



#define ROW 11
#define COL 11

struct Node //树节点
{
	int row, col;
	Node* parent;//父节点
	vector<Node*>child;//子节点
};

struct MapNode  
{
	int value;
	bool isWalk;
};

struct MapPoint// 地图的行列
{
	int row;
	int col;		 
};

enum tryDir  //上下左右四个方向
{
	em_Down,
	em_Up,
	em_Left,
	em_Right,
};

int gMap[ROW][COL] = {
		{ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 },
		{ 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1 },
		{ 1, 0, 1, 0, 1, 1, 1, 1, 1, 0, 1 },
		{ 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1 },
		{ 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1 },
		{ 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1 },
		{ 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1 },
		{ 1, 0, 0, 0, 1, 0, 1, 1, 1, 0, 0 },
		{ 1, 0, 1, 1, 1, 0, 1, 0, 0, 0, 1 },
		{ 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1 },
		{ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }
};

MapNode gMapNode[ROW][COL];

void InitMapNode();

Node* CreatNode(MapPoint point);

bool isCanWalk(MapPoint point);

int _tmain(int argc, _TCHAR* argv[])
{
	InitMapNode();

	MapPoint startPos = { 1, 1 }, endPos = { 7, 10 };
	gMapNode[startPos.row][startPos.col].isWalk = true;//将初始位置标记为走过

	bool isFindEnd = false;

	Node* pRoot = CreatNode(startPos);

	MapPoint currentPos = startPos;
	MapPoint nextPos;

	vector<Node*>currentLevel;
	currentLevel.push_back(pRoot);

	while (1)
	{
		vector<Node*>nextLevel;//存储每一层可通行的点 

		for (int i = 0; i < currentLevel.size(); i++)//遍历当前层所有节点
		{
			for (int j = 0; j < 4; j++)//四个方向
			{
				nextPos.col = currentLevel[i]->col;//将要走的下一个节点
				nextPos.row = currentLevel[i]->row;
				switch (j)
				{
				case em_Down:nextPos.row++; break;
				case em_Up:nextPos.row--; break;
				case em_Left:nextPos.col--; break;
				case em_Right:nextPos.col++; break;
				}
				if (isCanWalk(nextPos))//判断下一个是否能走
				{
					if (nextPos.row==endPos.row && nextPos.col==endPos.col)
					{
						isFindEnd = true;//找到终点
						break;
					}

					Node* pNew = CreatNode(nextPos);//产生一个新节点

					currentLevel[i]->child.push_back(pNew);//将可以走的这个点作为上一个可以走的节点孩子入树
					pNew->parent = currentLevel[i];//上一个可以走的节点作为当前可以走的节点的父亲
					gMapNode[nextPos.row][nextPos.col].isWalk = true;//标记已经走过了
					nextLevel.push_back(pNew);//
				}

			}
		}
		if (isFindEnd)
		{
			printf("找到了终点\n");
			break;
		}
		if (nextLevel.size()==0)
		{
			printf("没有找到终点啊\n");
			break;
		}
		currentLevel = nextLevel;
	}

	return 0;
}

void InitMapNode()
{
	for (int i = 0; i < ROW; i++)
	{
		for (int j = 0; j < COL; j++)
		{
			gMapNode[i][j].value = gMap[i][j];
		}
	}
}


Node* CreatNode(MapPoint point)
{
	Node* pNode = new Node;
	pNode->col = point.col;
	pNode->row = point.row;
	pNode->parent = 0;
	return pNode;
}

bool isCanWalk(MapPoint point)
{
	if (point.row>=ROW || point.row<0 || point.col>=COL || point.col<0)
	{
		return false;
	}

	if (gMapNode[point.row][point.col].value == 1 && gMapNode[point.row][point.col].isWalk==true)
	{
		return false;
	}
	return true;
}

Unity广度寻路算法 由于项目中的连接点是逻辑上的点,采用的是图的连接方式,所以采用广度寻路的方法。路径点命名规则如下: 用逗号隔开,第一位代表本名,后面跟的是可寻路径点名字。 寻路方法如下: using System.Collections; using System.Collections.Generic; using UnityEngine; public class FindWayPath { class Node { public string name;//真名 阅读详情

相关推荐

人工智能: 自动寻路算法实现(一、广度优先搜索)

前言随着人工智能技术的日益发达,我们的生活中也出现了越来越多的智能产品。我们今天要关注的是智能家居中的一员:扫地机器人。智能扫地机器人可以在主人不在家的情况下自动检测到地面上的灰尘,并且进行清扫。有些更为对路线进行规划,找到可以清理灰尘的最短路径,达到省电的效果。当然,绕过障碍物也是必须拥有的技能。我们今天就来看一下扫地机器人自动寻路的算法的简单实现。这里我们不对机器人如何识别出灰尘进行讨论,我们只

天降风云的博客 1万+

广度优先搜索算法(BFS)详解

参考:https://www.cnblogs.com/tianqizhi/p/9914539.html 广度优先搜索算法(又称宽度优先搜索)是最简便的图的搜索算法之一,这一算法也是很多重要的图的算法的原型。Dijkstra单源最短路径算法和Prim最小生成树算法都采用了和宽度优先搜索类似的思想。其别名又叫BFS(breadth-first search),属于一种盲目搜寻法,目的是系统地展开...

lemonxiaoxiao的博客 4万+

广度优先算法、最佳优先算法、A*算法寻路程序

一个用广度优先算法、最佳优先算法、A*算法寻路的程序,版本VS2015,用c++编写,mfc可视化,用动画将每种算法的搜索过程展现出来。

BFS——广度优先算法(Breadth First Search)

1、前言 这几天刷leetcode经常碰到DFS BFS的问题,之前一直也是模棱两可,凭着感觉做,是需要总结一下了。 广度优先搜索(也称宽度优先搜索,缩写BFS,以下采用广度来描述)是连通图的一种遍历策略。因为它的思想是从一个顶点V0V_0开始,辐射状地优先遍历其周围较广的区域,因此得名。 一般可以用它做什么呢?一个最直观经典的例子就是走迷宫,我们从起点开始,找出到终点的最短路程,很多最短路径算

g11d111的博客 15万+

【10. Wi-Fi 通用模组-小米 IoT 平台-如何进行硬件调试】

调试APP功能:从米家服务器缓存读取设备状态,等同于米家APP 的环境,开发者使用该调试器可模拟用户使用设备的实际情况,即调试米家 App 中的扩展程序。- 调试固件:调试器从固件读取设备状态,用于调试设备模组固件的某个单项功能,开发者使用该调试器可针对性地调试设备的某个功能。小爱语控测试工具:如果当前产品可被小爱语控,则可以使用该工具调试语控效果。调试APP功能(云端缓存)

tuoyuanO的博客 1041

共享单车数据分析与需求预测项目

除了自行车共享系统的有趣的实际应用之外,这些系统生成的数据特征使它们成为研究的有吸引力的对象。由于这些系统在交通、环境和健康问题中的重要作用,它们引起了极大的关注。Huber 回归器:一个对异常值具有鲁棒性的模型,CV 得分为 0.4660,表明它对此数据集可能不那么有效。代码中的内容cv_score就像您正在使用的机器学习模型的成绩单。它告诉您模型的表现如何。减少异常值的影响:它还可以减少异常值的影响,因为对数转换显着缩小了数据的范围。因此,cv_score平均分数表明您的模型的预测效果如何。

极光喵的博客 2947

寻路算法 --- 广度寻路算法

深度寻路:一个个去试,空旷地形 广度寻路:和深度寻路算法思想截然不同,不是一个个去试,而是依次展开:同样是从起点开始,看周围有哪些可以走的,依次去建立一棵树[ 只有四个方向:四叉树 ],总有一个地方,树会到达终点,最终这棵树会遍布整个地图,1. 到达终点,直接结束 2. 等整个地图都找完了,没有地方拓展了,再循环结束-> 树会记录从起点到每一个点的路径-> 可以找到多条路 不需要回退,一定能找到最佳路径 因为总是需要去拓展,循环次数会变得很多:消耗时间长,适合小地图,非空旷地形 注意:要.

weixin_60569662的博客 1337

STM32基于软件模拟IIC进行AHT21B温湿度采集

通过学习软件IIC来进行实操AHT21B采集温湿度。

Liu-FE的博客 3700

常见的寻路算法

不同的寻路算法适用于不同的场景,需要根据具体的问题特点,如图的规模、边的权重、是否需要最短路径等因素来选择合适的算法。请根据具体的问题修改图的结构和节点关系,以适应不同的寻路需求。

weixin_51782176的博客 2141

基于51单片机的简易计算器设计(原理图+仿真+源代码+参考论文)

本设计以51单片机为核心,矩阵键盘输入数字,通过1602显示屏显示计算结果,能够实现整数的加、减、乘、除四则运算,具备清除功能。

u012759563的博客 7696

配置VScode编译、调试STM32(一)手动配置makefile和debug

做嵌入式的朋友们都应该有过想要有个功能强大的IDE或者编辑器,Keil MDK5、IAR EWARM是用的比较普遍的平台了,但是两者在编辑器方面都比较弱势,当然可以设置 或者使用外部编辑器,像Sourceinsight、notePad++这样,但毕竟需要切换回来进行Build、Debug,非常麻烦。 VScode从发布至今口碑一直很好,而且里面有非常多的插件,比如彩虹括号、Code Runner、...

hanhe0551的博客 4289

广度优先寻路算法

广度优先遍历,是一种非启发式、不用预处理的寻路算法。通常会将整个图全部遍历,意图寻找终点。从起点开始,每次所有符合的点全部遍历,类似于扩散的样子。 一般情况,广度优先遍历算法都是基于队列结构,先进先出的遍历所有节点。 该寻路算法,通常先将起点加入队列结构,然后将该点周边符合要求(未加入队列结构并且可以到达的点)的点全部再次加入队列结构中,意图下一次遍历...

zhanglu_1024的博客 1407

斑马打印机状态监控进阶:不用SDK也能获取打印状态的3种野路子

本文介绍了三种不依赖官方SDK的斑马打印机状态监控方法,包括SGD命令、TCP端口嗅探和共享打印机日志分析。这些方案适用于老旧系统或网络受限环境,帮助运维人员实时掌握打印状态,提升设备管理效率。特别适合工业自动化和物流仓储场景中的应急处理。

weixin_42628688的博客 427

探索迷局:解密广度寻路算法

" 探索迷局:解密广度寻路算法 "

热爱编程的小K的博客 2023

8.5华为OD机试真题 新系统 - 最长不连续子串 (Java/Py/C/C++/Js/Go)

8.5华为OD机试真题 新系统 - 最长不连续子串 (Java/Py/C/C++/Js/Go)

算法大师! 623

ABAP RAP 行为建模深入学习:从 Behavior Definition 到 Behavior Implementation 的完整实践指南

ABAP RAP开发指南:业务行为定义与实现 本文介绍SAP RAP框架中业务对象行为的开发方法: 分层设计 Behavior Definition声明业务能力(增删改查、校验、动作等) Behavior Implementation在ABAP类中编写具体逻辑 核心组件 使用BDL定义业务行为 通过FOR BEHAVIOR OF绑定行为池类(ABP) 在本地类实现校验/确定/动作逻辑 关键特性 支持managed/unmanaged两种实现模式 提供草稿表、并发控制等企业级功能 通过EML以别名访问实体 开

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 411

寻路算法:广度寻路

1.介绍 广度寻路算法是上,左,下,右一起试探,把试探过能走的点用以四叉树的方式保存起来,直到试探到终点。 广度相比于深度,可以找到从起点到终点的最佳路径 废话不多说,看图 2.图 图中1表示起点,2表示终点 3.步骤&&方法: 1.如上图,这里引入一个层的概念,例如起点(1,9)就是第一层,随之试探出第二层… 2.这里可以使用C++的vector,把第一层的节点存入vector中,在进行循环,在之后吧第一层的每一个节点试探出的节点存放到vect中,直到试探出终点循环结束。 4.代码 #

m0_54098516的博客 667

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

广度寻路算法思想及代码

广度寻路算法 树结构 vector容器 C++实现。某个位置有没有走过,走过则为true,走过了则之后不能再走)。每个节点都要存储每个位置点坐标,并且这个节点具有。,当树干上的某一片树叶碰到了终点,则到达终点,(提前试探位置的一个辅助点,帮助看能否移动)。)存储树的每一层的节点,要有。我的理解:广度寻路算法是以。树根首先进入当前层的容器中。......

ylh的博客 1124

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

Day9:寻路算法之BFS广度寻路算法

BFS

zjjaibc的博客 842

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

广度寻路算法C++实现

广度寻路算法C++实现 广度寻路和深度寻路算法是两种常用的图形搜索算法,当然这里的寻路,是指在一个二维平面上,我们将平面划分为许多个方格,给定目的地和起始地,寻找到一条起点到终点之间的路径。广度寻路算法能找到最短路径,而深度寻路算法并不保证找到的路径是最短的路径。但由于广度寻路算法中的循环嵌套比较多,耗费资源大,因此广度寻路算法更适合用于小一点的地图场景。而深度寻路算法就更适合开阔的大地图。 本篇文章来介绍广度寻路算法,有关深度寻路算法的之后再更。 所谓广度寻路,就是将起点作为根节点构造一棵树,每个结点的孩

NKU_Yang的博客 868

CPPDay19:深入浅出广度寻路算法

目录 0x00 存储实际地图: 0x01 广度寻路算法的思路: 0x02比较深度寻路与广度寻路: 0x03 代码: 深度寻路算法:先深挖再拓宽 广度寻路算法:先拓宽 从离散数学的角度来看,该图中每一个点都是一个四叉树。因为每个点都有4个方向可以走。所以图中每个点的存储结构使用四叉树。 0x00 存储实际地图: 和深度寻路算法的思路一样,首先我们需要将实际地图用一个二维数组...

坚持硬核 384

(算法)广度寻路

点这里点这里!!!

Ljh578519469的博客 451

数据结构与算法_广度优先寻路算法

广度优先搜索 广度优先寻路算法实际上是对一个地图上所有可通行的点的遍历从而找出一条最短路径 理解为树的层数的遍历 广度寻路搜索直线,不搜索斜线 链表的排序过程请见附图(链表的排序过程) 2. 广度优先寻路算法实现 #include<stdio.h> #include<vector> using std::vector; //1. 准备地图 #define MAP_RO...

刘同学的博客 675

数据结构与算法:广度寻路算法的C++实现

任务:初始化一个10*10的地图(利用整型变量模拟,1代表墙壁,0代表通路),给定起始位置和目标位置,利用广度寻路算法找到最短路径。 main.cpp代码如下: #include <iostream> #include <vector> #define ROWS 10 #define COLS 10 using namespace std; //枚举类型,表示探索方向 enum Direct { D_up, D_right, D_down, D_left}; //定义辅

weixin_44928892的博客 252

算法_迷宫寻路算法_广度优先

先出一个迷宫数据文件: maze.in 6 8 0 1 0 0 0 1 1 0 0 0 0 1 0 1 1 0 0 1 0 1 0 1 1 0 1 0 0 1 0 0 0 1 0 0 1 0 1 1 0 0 1 1 0 0 0 1 1 1 这个文件描述了一个6行8列的迷宫数据,0表示路,1表示墙 接下来要做的就是要使用广度优先算法把这个迷宫给走通,下面简单介绍一下思路,细节部分直接上代码: 1、...

wangqiang9x的博客 596

各类寻路算法的可视化比较(A*,广度,深度及优化)

各类寻路算法的可视化比较(A*,广度,深度及优化) 点击获取下图地址 在学习游戏迷宫生成算法的时候涉及到了很多数据结构问题,为此三胖写了可视化工具辅助记忆。 地图点击可以切换道路(白色)或墙板(灰色),点击开始寻路即可显示路径(指向父节点) 深度优先遍历 有人说深度优先搜索就是递归 就是上下左右能走就走,走不了则从上一个可以走的节点继续走,不一定是最优解 核心思路: 创建大小相同二维数组保存路...

唐三十胖子的博客 2715
上一篇: 深度寻路算法的实现
下一篇: A星寻路算法
靠普科技
博客等级 码龄7年 14粉丝 20原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值