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

解决二维矩阵中最大连通路径 应用在:算法可应用于俩点用一条直线连接,迷宫路径的最优解。求二维矩阵中权值最大路径。 算法思路:在矩阵路线遍历中,利用函数迭代,在上,下,左,右四个方向迭代,函数入栈时记录函数操作,退栈时恢复入栈的操作,在此过程中记录最优的迭代过程。 #include <stdlib.h> #include <stdio.h> #include <string.h> //定义矩阵中行与列坐标 typedef struct { int r; int l; }Node; / 阅读详情

问题一: 给定一个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())
			   {
				   bestPath.clear();
				   i = 0;
				   while(i < totalPath.size())
				   {
					bestPath.push_back(totalPath[i]);					
					i++;
				   }
			   }		   
		    }
	      }
		 if((x-1)>= 0){findBestPath(matrix,rows,cols,Point((x-1),y),p2,visited,totalPath,bestPath);}
		 if((x+1)<rows){findBestPath(matrix,rows,cols,Point((x+1),y),p2,visited,totalPath,bestPath);}
		 if((y-1)>= 0){findBestPath(matrix,rows,cols,Point(x,(y-1)),p2,visited,totalPath,bestPath);}
		 if((y+1)<cols){findBestPath(matrix,rows,cols,Point(x,(y+1)),p2,visited,totalPath,bestPath);}	
		  //回溯很重要,理解这个问题,要不要加判断,什么时候写,什么时候不写这个回溯,终点为终止条件
		 // if(x != p2.x || y != p2.y){
		  totalPath.pop_back();
		  visited[x*cols + y] = false;
		  // }
	   }
	   return;   
 }


问题二:矩阵中的路径

请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径。路径可以从矩阵中的任意一个格子开始,每一步可以在矩阵中向左,向右,向上,向下移动一个格子。如果一条路径经过了矩阵中的某一个格子,则该路径不能再进入该格子。 例如[a b c e s f c s a d e e]是3*4矩阵,其包含字符串"bcced"的路径,但是矩阵中不包含“abcb”路径,因为字符串的第一个字符b占据了矩阵中的第一行第二个格子之后,路径不能再次进入该格子。

解题思路和上题相同,主要是终止条件,递归条件不同,要求的返回值情况不同,所以要注意递归的情况的使用

  bool flag = false;
    bool hasPath(char* matrix, int rows, int cols, char* str)
    {   if(matrix == NULL || rows < 1 || cols < 1 || str == NULL)
		{
			return false;
		}
		bool *visited = new bool[rows * cols];
		memset(visited, 1 ,rows * cols);//默认值为true都可以走
        int count = 0;//记录走的点的个数
        //找出开始走的点位置  
           for(int i = 0; i < rows;i++){
            for(int j = 0;j < cols;j++){
                if(matrix[i*cols + j]== str[count]) 
                {                    
                    flag = hasNextNode(matrix,rows,cols,i,j,str,count,visited);
                }               
               }            
            }
	    delete[] visited;
        return flag; 
   }
    
    //找出下一个节点
   bool hasNextNode(char* matrix, int rows, int cols,int x,int y, char* str,int count,bool * visited)
    {  
        if(str[count] == '\0')//判断str是否已经走完
        {
            return true;            
        } 
	 if(x >= 0 && x < rows && y >=0 && y < cols && matrix[x*cols + y] == str[count] && visited[x*cols + y])
		{
            //matrix[x*cols + y] = '0';//char*的类型值不能修改,所以这么来判断是否走过是不对的。
            visited[x*cols + y] = false;//走过不能走了,为false
			count++;//将str的位置后移 
			//找出下一个点上下左右
            flag =     hasNextNode(matrix,rows,cols,(x-1),y,str,count,visited)
				   ||  hasNextNode(matrix,rows,cols,(x+1),y,str,count,visited)
				   ||  hasNextNode(matrix,rows,cols,x,(y-1),str,count,visited)
				   ||  hasNextNode(matrix,rows,cols,x,(y+1),str,count,visited);
	   if(flag == false)//flag不是全局变量
             {
                --count;
                visited[x*cols + y] = true;//回溯,表示此点还可以走
             }    
		}                  
        return flag; 
    }

问题三:机器人的运动范围

地上有一个m行和n列的方格。一个机器人从坐标0,0的格子开始移动,每一次只能向左,右,上,下四个方向移动一格,但是不能进入行坐标和列坐标的数位之和大于k的格子。 例如,当k为18时,机器人能够进入方格(35,37),因为3+5+3+7 = 18。但是,它不能进入方格(35,38),因为3+5+3+8 = 19。请问该机器人能够达到多少个格子?

解题思路:此题考查思路和上题相同,也考查了整数的每个位数值的和,但是终止条件不是很明确,但是递归的条件很明确,所以只要递归结束就可以返回值,为什么这里不用写回溯的情况呢,还不是很明白,之后看了一篇博客,http://blog.youkuaiyun.com/jinzhao1993/article/details/72850641

知道什么时候要回溯,什么时候不要了 和设置的判断变量是不是全局变量。count是全局变量,flag不是全局变量


 int movingCount(int threshold, int rows, int cols)
    {
        if(rows<0 || cols<0 )return 0; 
        bool *visited = new bool[rows * cols];//定义判断此点是否走过的数组并赋值为true
        memset(visited,1,rows * cols);
        int count = movingNextPoint(threshold,rows,cols,0,0,visited);
        delete []visited;
        return count;
    } 
    
    int movingNextPoint(int threshold, int rows, int cols,int x,int y,bool *visited)
    {
        int count = 0;
        if(x >=0 && x < rows && y >= 0 && y < cols && (sumPerInt(x) + sumPerInt(y))<= threshold && visited[x*cols + y] == true)
        {          
            visited[x*cols + y] = false;//表示此点已经走过不可以再走了
            count = 1 + movingNextPoint(threshold,rows,cols,(x-1),y,visited)
                      + movingNextPoint(threshold,rows,cols,(x+1),y,visited)
                      + movingNextPoint(threshold,rows,cols,x,(y-1),visited)
                      + movingNextPoint(threshold,rows,cols,x,(y+1),visited);     
        }          
        return count;               
    }   
    //求整数各个位数之和
    int sumPerInt(int num){
        int sum = 0;
        while(num > 0){
            sum += num % 10;
            num /= 10;
        }
        return sum;
    }

这和四叉树的深度很相似,就是四叉树的深度遍历,我当时没有没有联想到~~~~

如果先让你做多叉树的广度深度遍历,然后再让你做这个题,可以就好想一点了。。

算法:动态规划 寻找2D矩阵中到达某一坐标的可能路径总数进阶版(添加路障) dp基础问题: 寻找2D矩阵中到达某一坐标的可能路径总数(含路障) 问题描述: 问题和上一篇博文类似,不过这次加上一个设定:有一些坐标为路障,不让通行。 分析: 加上路障之后,大致的解题思路是一样的,但是有一些条件需要被考虑到我们求解的过程中: 如果起始坐标就是路障,则问题无解 如果在行进过程中遇到路障,则 numWays[i][j] 的值设为一个不存在的值,因为坐标(i,j)无法到达。 如果最顶或者最左的坐标遇到一个路障,则路障之后的所有坐标都无法到达。 考虑到这些条件,此问题的算法如下: 算法: / 阅读详情

相关推荐

回溯法--深度优先搜索

回溯法--深度优先搜索,AutoPilot02(去哪儿2017校招真题),AutoPilot(去哪儿2017校招真题),矩阵中的路径,剑指offer;机器人的运动范围 ,剑指offer

mine_song的博客 5209

矩阵走迷宫:BFS

1、矩阵走迷宫问题描述 给定一个只有 0 和 1 的矩阵,0 代表障碍物,1 代表可以通过。求从起点 B 到终点 E 的最短路径。 输入: 第一行:两个数字 n 、m,代表矩阵大小; 接下来 n 行:代表矩阵输入; 接下来一行:代表起点坐标; 最后一行:代表终点坐标。 输出: 从起点到终点的最短路径...

weixin_41565755的博客 1078

矩阵路径问题:DFS回溯算法详解与优化

深度优先搜索(DFS)是解决图论和矩阵遍历问题的核心算法,通过递归实现状态空间的系统探索。当结合回溯思想时,DFS能有效处理路径搜索中的试错与回退需求,这种组合在矩阵路径问题中展现出独特优势。算法工程师常用DFS+回溯解决字符矩阵中的单词匹配、机器人路径规划等实际问题,其时间复杂度通常为O(3^L)(L为路径长度)。在工程实践中,通过预处理剪枝、方向搜索顺序优化和并行计算等技巧,可以显著提升算法性能。本文以经典的矩阵路径问题为例,详细解析DFS回溯的实现框架、边界处理方法和多线程优化方案,帮助开发者掌握这一

weixin_30512089的博客 344

剑指offer12 13 回溯法 矩阵中路径 机器人运动范围

回溯法思想 回溯法是一种选优搜索法,按选优条件向前搜索,以达到目标。但当探索到某一步时,发现原先选择并不优或达不到目标,就退回一步重新选择,这种走不通就退回再走的技术为回溯法 题目一:矩阵中的路径 请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径。路径可以从矩阵中的任意一个格子开始,每一步可以在矩阵中向左,向右,向上,向下移动一个格子。如果一条路径经过了矩阵中的某一个格...

qq_33604222的博客 307

矩阵路径问题的回溯算法与DFS优化实践

回溯算法是解决组合优化问题的经典方法,通过系统性地探索解空间来寻找可行解。其核心原理是通过递归尝试所有可能的选择,并在遇到无效路径时及时回退。在矩阵路径问题中,DFS(深度优先搜索)与回溯的结合能有效探索二维空间中的连续路径。这种技术广泛应用于游戏AI路径规划、机器人运动控制等场景,特别是在需要验证序列存在的场景中表现突出。本文以《剑指Offer》经典题目为例,详细解析如何通过剪枝优化和迭代式改造来提升算法效率,其中涉及的预处理技术和方向数组优化能显著降低时间复杂度。

weixin_33860553的博客 407

python【力扣LeetCode算法题库】面试题13- 机器人的运动范围(BFS)

面试题13. 机器人的运动范围 地上有一个m行n列的方格,从坐标 [0,0] 到坐标 [m-1,n-1] 。一个机器人从坐标 [0, 0] 的格子开始移动,它每次可以向左、右、上、下移动一格(不能移动到方格外),也不能进入行坐标和列坐标的数位之和大于k的格子。例如,当k为18时,机器人能够进入方格 [35, 37] ,因为3+5+3+7=18。但它不能进入方格 [35, 38],因为3+5+3+8...

NJU phd 在读。 1003

浅谈回溯法---矩阵中的路径,机器人的运动范围

开篇送给读者两句话: 一个人可以走的快,但一群人才可以走的远。 听不同的音乐,看不同的书,游历不同的城市,邂逅不同的人,思维和际遇有交集,亦有合集,走的多了,站的高了,自然就看的远了。        犹记初春实习面头条的时候,记得第一道题就是矩阵中的路径问题,大概是这样:有一个2*2的矩阵,有起点A和终点B,矩阵中有很多障碍物,代码实现从A到B的最短路径,这道题和我今天要说的矩阵的搜索路径有...

~星空任我游~ 533

最优算法100例之40-矩阵中的路径

最优算法100例之40-矩阵中的路径,请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径。路径可以从矩阵中的任意一个格子开始,每一步可以在矩阵中向左,向右,向上,向下移动一个格子。如果一条路径经过了矩阵中的某一个格子,则该路径不能再进入该格子。

随风浪仔的专栏 668

回溯(DFS、BFS)-python

回溯机器人的运动范围-剑指offer矩阵中的路径-剑指offer 机器人的运动范围-剑指offer 地上有一个rows行和cols列的方格。坐标从[0,0]到[rows-1,cols-1]。一个机器人从坐标[0,0]的格子开始移动,每一次只能向左、右、上、下四个方格移动一格,但是不能进入行坐标和列坐标的数位之和大于threshold的格子。例如,当threshold为18时,机器人能够进入方格[35,37],因为3+5+3+7=18.但是,它不能进入方格[35,38]。因为3+5+3+8=19.请问该机器人

qq_39568387的博客 1719

IDEA集成selenium自动化测试(Java+Selenuim+testNG+Maven)

文章目录写在前面01 | 新建Maven项目02 | idea集成Selenium03 | 写在前面 因为软件测试的需求和博主比较经常使用Java,于是,想在Idea中集成selenuim,用Java编写测试代码,因此有了这篇文章来记录一下过程。 资源指路: java使用selenium实现模拟浏览器操作API大全 模拟登录 TestNG入门教程 感谢上面博客的大佬。 01 | 新建Maven项目 不使用骨架创建,直接点击左侧Maven,然后一路next即可。 02 | idea集成Sele

aLinxi的博客 8279

COMSOL求解器实战:如何避免非线性问题求解失败(附牛顿法调试技巧)

本文深入探讨了COMSOL求解器在处理非线性问题时常见的失败原因及解决方案。通过分析物理模型非线性特性、初始条件敏感性和求解器参数配置,提供了牛顿法调试的黄金四步法,包括模型检查、分阶段求解、参数调优和高级诊断工具应用。特别针对材料非线性、几何非线性和多物理场耦合等典型工程场景,给出了实战技巧和预防性建模策略,帮助工程师有效避免求解失败。

weixin_29284657的博客 419

[剑指-Offer] 13. 机器人的运动范围(回溯、DFS、递归、代码优化)

文章目录1. 题目来源2. 题目说明3. 题目解析方法一:DFS、回溯、bool矩阵方法二:DFS、回溯、代码优化方法三:DFS性质、回溯、递归、代码优化 1. 题目来源 链接:机器人的运动范围 来源:LeetCode——《剑指-Offer》专项 2. 题目说明 地上有一个 m 行 n 列的方格,从坐标 [0,0] 到坐标 [m-1,n-1] 。一个机器人从坐标 [0, 0] 的格子开始移动,它每...

Y-puyu 的博客 383

从示波器波形看懂死区:手把手教你调ST MCU的PWM,避免三相桥直通炸管

本文详细解析了如何通过示波器波形判断PWM死区时间,并手把手教你调整STM32高级定时器寄存器,避免三相逆变桥直通炸管。文章涵盖死区时间的本质与风险、STM32配置详解、示波器调试技巧及FOC系统中的特殊考量,帮助工程师优化电机驱动性能与安全性。

weixin_30315723的博客 733

回溯法

剑指offer 矩阵中的路径 题目描述 请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径。路径可以从矩阵中的任意一个格子开始,每一步可以在矩阵中向左,向右,向上,向下移动一个格子。如果一条路径经过了矩阵中的某一个格子,则之后不能再次进入这个格子。 例如 a b c e s f c s a d e e 这样的3 X 4 矩阵中包含一条字符串"bcced"的路径,但是矩...

u014034497的专栏 185

提升YOLOv8检测精度的边界框损失函数Focaler-IoU与InnerFocalerIoU的应用与效果

YOLOv8是一种常用的实时目标检测模型,基于CNN(卷积神经网络)结构并结合了一些改进技术以提高检测精度和速度。YOLOv8的核心在于边界框的预测和分类,而准确的边界框预测是提高模型整体性能的关键因素之一。在传统的IoU损失基础上,Focaler-IoU和InnerFocalerIoU进一步聚焦于边界框的边缘区域,通过调整损失权重,更好地关注难以检测的边界框,提高模型的鲁棒性和准确性。# 计算IoU# 计算Focaler-IoU损失在这里,我们定义了。

博客 1340

2篇1章1节:数据的基本概念以及 R 中的数据结构、向量与矩阵的创建及运算

本文详细介绍了R语言中常见的数据结构的向量和矩阵。通过掌握这些数据结构的基本概念和操作技巧,可以更高效地处理和分析数据。

MD Code 1243

【剑指Offer】机器人的运动范围

文章目录剑指Offer.13:机器人的运动范围一、题目描述二、问题分析数位之和运算问题解决 剑指Offer.13:机器人的运动范围 一、题目描述 地上有一个m行n列的方格,从坐标 [0,0] 到坐标 [m-1,n-1] 。一个机器人从坐标 [0, 0] 的格子开始移动,它每次可以向左、右、上、下移动一格(不能移动到方格外),也不能进入行坐标和列坐标的数位之和大于k的格子。例如,当k为18时,机器人能够进入方格 [35, 37] ,因为3+5+3+7=18。但它不能进入方格 [35, 38],因为3+5+3+

居易 284

SAP 标准 CDS View 到底能不能用 CDS Extension View 扩展,我们在项目里应该这样判断

文章摘要:判断SAP标准CDS视图(如A_PRODUCT)能否扩展字段,不能仅凭命名或@Metadata.allowExtensions判断,需检查DDL源码中的@AbapCatalog.viewEnhancementCategory值。#PROJECTION_LIST允许扩展字段,#NONE则禁止。聚合视图需额外包含#GROUP_BY,UNION视图需#UNION。CDS View Extension用于新增字段,Metadata Extension仅用于添加注解。在ABAP Cloud环境中还需检查AP

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

【机器人避障路径规划】从C-Space到A*算法的多边形机器人避障路径规划研究(Matlab代码实现)

本文聚焦于矩形机器人在多障碍物环境中的避障路径规划问题。通过引入构型空间(C-Space)理论,将复杂几何外形的机器人在物理空间中的运动规划转化为点在构型空间中的路径寻找问题。研究内容包括基于Minkowski差集理论的构型障碍物计算、三维构型空间建模、A路径搜索算法以及动态可视化实现。实验结果表明,该方法能有效规划出无碰撞路径,为移动机器人在复杂环境中的自主导航提供了可行的解决方案。

weixin_46039719的博客 1755

NR PUCCH(二)PUCCH format 2/3/4

继续看PUCCH2/3/4:PUCCH format 0和1所携带的信息bits少,UCI bits2bits,信息bit需要经过编码等过程下面分别来看。

ModemProtocol的博客 538

基于Jeecgboot3.9.0的vue3版本前后端分离的flowable流程管理平台

基于Jeecgboot3.9.0的vue3版本前后端分离的flowable流程管理平台

宁波阿成的博客 902

Python 动态规划 实现机器人躲避障碍物获取最短路径

Python 动态规划 实现力扣问题:实现机器人躲避障碍物获取最短路径。

weixin_50064049的博客 1738

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

上一篇: 关于链表中去掉重复数值的问题
下一篇: 判断链表有环没环及环的入口结点问题 和 判断两个链表是否相交
Traveling_DING
博客等级 码龄12年 65粉丝 29原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值