回溯——矩阵中路径问题(0,1矩阵中最优路径、矩阵中的路径、机器人的运动范围)

本文探讨了如何使用回溯法解决两类矩阵路径问题:0,1矩阵中最优路径和机器人运动范围。在0,1矩阵问题中,从起点到终点的最短路径被寻找,而在机器人运动范围问题中,考虑了行坐标和列坐标的数位之和不超过特定值的限制。解题关键在于确定递归结束和递归条件,以及何时进行回溯。" 79427671,5670291,OPENSSL证书操作与格式转换指南,"['加密技术', '网络安全', '证书管理', 'openssl工具']
摘要由CSDN通过智能技术生成

问题一: 给定一个rows*cols 大小的0,1矩阵,给出起点和终点坐标,0可以走,1不可以走,每次只能向上下左右,走一步,求出从起点到终点的最短路径;

解题思路:回溯法解决的经典问题,由于回溯的递归特性,首先要找到递归结束的条件,本题终点就是结束条件(在递归结束判断此路径是否为最优路径)

                    其次,找出递归的条件,本题是坐标x,y的值在合理范围内,并且此点没有走过

                    回溯的位置与条件,当第n个位置四周都为1,都不可以走,则需要回到第n-1位置,只需将第n的位置弹出,设置为没有走过。

//*matrix表示二维0,1矩阵; rows表示矩阵的行数,cols表示矩阵的列数,

//*p1表示起点坐标,p2表示终点坐标,bool *visited用来标记矩阵中的点是否走过没有为0,走过为1;

//*vector<Point>& totalPath 用来盛放最新求出的路径,vector<Point>& bestPath用来盛放最短的路径,这两个参数都加了引用,表示指向实参的位置,而不是重新开辟新的变量,因为在递归调用时,这两个参数会随之改变。

void findBestPath(int *matrix,int rows,int cols,Point p1,Point p2,bool *visited,vector<Point>& totalPath,vector<Point>& bestPath)
 {
	   int x = p1.x, y = p1.y;	   
	   if(visited[x*cols + y] == false && matrix[x*cols + y] == 0)
	   {		
		   totalPath.push_back(p1);
	       visited[x*cols + y] = true;
		 if(x == p2.x && y == p2.y)//这个结束判断语句什么时候写
	     {
		   //如果是找到的第一条路径,直接添加到bestpath中
		   int i = 0;
		   if(bestPath.size() == 0)
		   {   
			   while(i < totalPath.size())
			   {
				   bestPath.push_back(totalPath[i]);
				   i++;
			   }
		   }
		   else
		   {
			   //选择一个最短的路径放到bestPath中
			   if(bestPath.size() > totalPath.size())
			   {
			
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值