深度优先搜索笔记2-机器人路径规划

以下代码改编自《啊哈,算法》,原代码只输出了路径的步数,改编后可以输出所有可行路径与最最短路径。

问题:

已知地图map,给定起点和目标点,要求输出从起点到目标点的所有路径,并计算最短的路径

代码:

/*
已知地图map,给定起点和目标点,要求输出从起点到目标点的所有路径,并计算最短的路径
*/

#include<iostream>
#include<vector>
using namespace std;

typedef struct Map
{
	int row;
	int col;
	vector<vector<int>> map;
	vector<vector<int>> book;
};

typedef struct Position
{
	int x;
	int y;
};

typedef vector<Position> Route;

void dfs(Map& map, Position& curPos,Position&tarPos,vector<Route>& routes)
{
	static Route route;//存储当前路径使用
	int tx, ty;
	int next[4][2] = { { 0, 1 }, { 1, 0 }, { 0, -1 }, { -1, 0 } };//一个点的上下左右
	if (curPos.x == tarPos.x&&curPos.y == tarPos.y)//判断是否到达目标点
	{
		routes.push_back(route);//将当前路径存储到路径表中
		return;//返回
	}
	for (int i = 0; i < 4; i++)//依次遍历当前点的右边、下边、左边、上边(顺时针方向)
	{
		tx = curPos.x + next[i][0];
		ty = curPos.y + next[i][1];
		if (tx<0 || tx >= map.row ||ty<0 || ty >= map.col)//检查边界条件
		{
			continue;
		}
		//查看此点是否是障碍物以及是否被标记
		if (map.map[tx][ty] == 0 && map.book[tx][ty] == 0)
		{
			map.book[tx][ty] = 1;//标记该点已经走过
			curPos.x = tx;//更新当前点坐标
			curPos.y = ty;
			route.push_back(curPos);//存入路径中
			dfs(map, curPos, tarPos, routes);//以该点为起点进行下一轮的搜索
			map.book[curPos.x][curPos.y] = 0;//取消对该点的标记
			route.pop_back();//弹出该点
			if (route.size() > 0)//判断是否是弹出的最后一个点
			{
				curPos.x = route.back().x;
				curPos.y = route.back().y;
			}
			else//是最后一个点时,将当前点设置为起点
			{
				curPos.x = 0;
				curPos.y = 0;
			}
		}
	}
	return;
}

int main()
{
	Map map;//地图
	Position initPos, tarPos;
	vector<Route> routes;//存储路径

	//定义地图的行和列
	map.row = 5;
	map.col = 4;
    //定义地图
	map.map = { {0,0,1,0},
				{0,0,0,0},
				{0,0,1,0},
				{0,1,0,0},
				{0,0,0,1}};
	//初始化book,用于记录该点是否已经走过
	map.book = {{ 0, 0, 0, 0 },
				{ 0, 0, 0, 0 },
				{ 0, 0, 0, 0 },
				{ 0, 0, 0, 0 },
				{ 0, 0, 0, 0 } };
	//起点坐标
	initPos.x = 0;
	initPos.y = 0;
	//终点坐标
	tarPos.x = 4;
	tarPos.y = 2;
	//将起点标记为已经走过
	map.book[initPos.x][initPos.y] = 1;
	//调用深度优先搜索算法计算可能的路径
	dfs(map, initPos, tarPos, routes);

	//输出路径
	int minStep = 99999,index;
	for (int i = 0; i < routes.size(); i++)
	{
		if (minStep>routes[i].size())
		{
			minStep = routes[i].size();
			index = i;
		}
		cout << "Route " << i + 1 << ": ";
		for (int j = 0; j < routes[i].size(); j++)
		{
			cout << "[" << routes[i][j].x << "," << routes[i][j].y << "] ";
		}
		cout << endl;
	}
	
	cout << "最短路径为:";
	for (int i = 0; i < routes[index].size(); i++)
	{
		cout << "[" << routes[index][i].x << "," << routes[index][i].y << "] ";
	}
	cout << "\n最短路径长度为:" << minStep << endl;

	system("pause");
	return 0;
}

输出结果:

设定起点为(0,0),目标点为(4,2):
这里写图片描述
参考文献:《啊哈,算法》–啊哈磊

  • 1
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: 对于您的问题,我可以给出以下回答: Webbots 实现路径规划的方法可以通过使用机器学习算法和搜索算法来实现。其中机器学习算法可以用于学习和预测路径规划结果,而搜索算法可以用于在已知的道路网络上搜索最短路径或最优路径,例如 A* 算法、Dijkstra 算法等。当然,具体的实现方法需要根据场景和需求进行设计和调整,以达到最优效果。 ### 回答2: webbots是一种通过模拟人类操作实现自动化任务的程序工具。它可以通过编程方式自动访问互联网上的网站,并运行指定的任务。对于路径规划任务,webbots可以通过以下方式实现: 首先,webbots可以利用爬虫技术收集相关的地理信息数据,例如地图、道路网络以及地理位置。这些数据可以通过互联网中的地图服务或者其他公开的地理数据源进行获取和整合。 接着,webbots可以利用这些地理信息数据来建立路径规划模型。路径规划模型可以使用图论或其他相关算法来表示道路网络,并为每个节点和边分配相应的权重,例如距离、时间、交通情况等。同时,模型还需要考虑起点和终点的位置、限制条件(如避免高速公路、尽量走绿色通道等)和用户的个性化需求。 在路径规划模型建立完成后,webbots可以使用搜索算法(如Dijkstra算法、A*算法等)来找到最优的路径。搜索算法会根据节点和边的权重以及用户的需求,通过逐步探索和评估各个可能的路径,最终找到最短或最优的路径。 最后,webbots可以将路径规划结果以图形或文本的形式反馈给用户。用户可以通过web界面或其他方式查看最佳路径、预估的时间和建议的导航指南。 综上所述,webbots实现路径规划的方法包括地理信息数据收集、路径规划模型建立和搜索算法应用。这些步骤可以使webbots成为一个高效、准确和实用的路径规划工具,帮助人们在使用互联网上的地图服务时更方便地规划出最佳路径。 ### 回答3: Web机器人(webbots)是程序在Web上自动执行任务和收集信息的工具。路径规划是指为了在网络中找到最佳路径从一个地点到另一个地点而进行的计算过程。Web机器人可以利用一些算法和技术来实现路径规划,以下是其中一些常用的方法: 1.广度优先搜索(BFS):这种方法通过逐层遍历网络上的节点来寻找最短路径。它从起始节点开始,依次访问与其相连的所有邻居节点,并将这些节点添加到待访问节点的队列中,直到找到目标节点或遍历完所有节点。 2.迪杰斯特拉算法(Dijkstra's algorithm):该算法通过计算从起点到其他节点的最短路径来确定最佳路径。它首先将所有节点的距离初始化为无穷大,然后逐步更新到达每个节点的最短距离,最终找到最短路径。 3.A*算法(A-star algorithm):A*算法结合了广度优先搜索和迪杰斯特拉算法的优点。它使用启发式函数估计从当前节点到目标节点的距离,并根据这个估计值优先选择下一个要访问的节点,以便更快地找到最佳路径。 4.深度优先搜索(DFS):DFS是一种递归的路径搜索算法,它会尽可能深入地搜索网络节点,直到找到目标节点或无法继续前进为止。然后回溯到上一个节点,并尝试其他路径,直到找到最佳路径。 总之,以上是一些实现Web机器人路径规划的常用方法,不同的方法适用于不同的情况和需求。在具体应用中,可以根据路径复杂性、时间效率和资源消耗等因素选择适合的方法。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值