《剑指offer》– 回溯法:矩阵中的路径、机器人的运动范围

《剑指offer》– 回溯法:矩阵中的路径、机器人的运动范围

一、矩阵中的路径

1、题目描述:

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

2、解决思路:使用“回溯算法”

参考牛客网的“张佃鹏”、“lizo”:https://www.nowcoder.com/questionTerminal/c61c6999eecb4b8f88a98f66b273a3cc

 (1)这是一个可以用回朔法解决的典型题。首先,在矩阵中任选一个格子作为路径的起点。如果路径上的第i个字符不是ch,那么这个格子不可能处在路径上的第i个位置。如果路径上的第i个字符正好是ch,那么往相邻的格子寻找路径上的第i+1个字符。除在矩阵边界上的格子之外,其他格子都有4个相邻的格子。重复这个过程直到路径上的所有字符都在矩阵中找到相应的位置。

(2)由于回朔法的递归特性,路径可以被开成一个栈。当在矩阵中定位了路径中前n个字符的位置之后,在与第n个字符对应的格子的周围都没有找到第n+1个字符,这个时候只要在路径上回到第n-1个字符,重新定位第n个字符。

(3)由于路径不能重复进入矩阵的格子,还需要定义和字符矩阵大小一样的布尔值矩阵,用来标识路径是否已经进入每个格子。 当矩阵中坐标为(row,col)的格子和路径字符串中相应的字符一样时,从4个相邻的格子(row,col-1),(row-1,col),(row,col+1)以及(row+1,col)中去定位路径字符串中下一个字符;

(4)如果4个相邻的格子都没有匹配字符串中下一个的字符,表明当前路径字符串中字符在矩阵中的定位不正确,我们需要回到前一个,然后重新定位。

(5)一直重复这个过程,直到路径字符串上所有字符都在矩阵中找到合适的位置.

3、代码实现:

public class Test28 {
	
	public boolean hasPath(char[] matrix, int rows, int cols, char[] str){
	    
	      int[] flag = new int[matrix.length];
	      for(int i = 0;i<rows;i++){
	    	  for(int j=0;j<cols;j++){
	    		  if(helper(matrix,rows,cols,i,j,str,0,flag)){
	    			  return true;
	    		  }
	    	  }
	      }
	      return false;
    }
	
	private boolean helper(char[] matrix,int rows,int cols,int i,int j,char[] str,int k,int[] flag){
		int index = i*cols+j;
		if(i<0 || i>=rows || j<0 || j>=cols || matrix[index]!=str[k] || flag[index]==1 ){
			return false;
		}
		
		if(k == str.length-1) return true;
		flag[index] = 1;

		if(helper(matrix, rows, cols, i - 1, j, str, k + 1, flag)
            || helper(matrix, rows, cols, i + 1, j, str, k + 1, flag)
            || helper(matrix, rows, cols, i, j - 1, str, k + 1, flag)
            || helper(matrix, rows, cols, i, j + 1, str, k + 1, flag)){
			return true;
		}
		
		flag[index] = 0;
		
		return false;
	}
}

 

 

二、机器人的运动范围:

1、题目描述:

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

2、解题思路:

参考牛客网的“lizo”:https://www.nowcoder.com/questionTerminal/6e5207314b5241fb83f2329e89fdecc8

思路也基本跟上一题的思路一样。

3、代码实现:

public class Test29 {
	public int movingCount(int threshold, int rows, int cols){
        
		int flag[][] = new int[rows][cols];//记录是否已经走过
		return helper(0,0,rows,cols,flag,threshold);
    }
	
	private int helper(int i, int j, int rows, int cols, int[][] flag, int threshold) {
		if(i<0 || i>=rows || j<0 || j>=cols || numSum(i)+numSum(j)>threshold || flag[i][j] ==1){
			return 0;
		}
		
		flag[i][j] =1;
		return helper(i-1,j,rows,cols,flag,threshold)
				+helper(i+1,j,rows,cols,flag,threshold)
				+helper(i,j-1,rows,cols,flag,threshold)
				+helper(i,j+1,rows,cols,flag,threshold)
				+1;
	}

	private int numSum(int i){
		int sum = 0;
		do{
			sum+= i%10;
		}while((i=i/10)>0);
		
		return sum;
	}
}

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/114686.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 开心网外挂开发之 Singleton 单件模式应用「建议收藏」

    开心网外挂开发之 Singleton 单件模式应用「建议收藏」经过我们的努力,操作开心花园的各个底层功能我都开发出来了,我把所有的直接操作的功能都封装成一个KaiXinHelper类,通过这个类我们可以登录开心网,可以获得开心花园的所有信息,可以收获、播种、除草

    2022年7月2日
    18
  • 图的两种遍历方式

    图的两种遍历方式遍历是指从某个节点出发,按照一定的的搜索路线,依次访问对数据结构中的全部节点,且每个节点仅访问一次。在二叉树基础中,介绍了对于树的遍历。树的遍历是指从根节点出发,按照一定的访问规则,依次访问树的每个节点信息。树的遍历过程,根据访问规则的不同主要分为四种遍历方式:(1)先序遍历(2)中序遍历(3)后序遍历(4)层次遍历类似的,图的遍历是指,从给定图中任意指定的顶点(称为初始点…

    2022年6月14日
    31
  • EasyCVR通过Ehome协议接入部分设备显示离线排查报告

    EasyCVR通过Ehome协议接入部分设备显示离线排查报告对于需要将不同视频协议做融合的项目,我们一般都是建议大家选用EasyCVR视频平台,EasyCVR支持多种协议的视频接入,对于通用的第三方协议,我们支持了海康的Ehome和GB28181的国标协议。EasyCVR视频网关平台接入的部分Ehome设备显示离线,可以从下图中看到,除了通过HIKSDK接入的设备外,通过Ehome接入的设备全部离线:可见离线的部分设备都是Ehome协议接入,Ehome设备为主动注册类型,判断设备是否真实在线的方法一般为抓取对应对端口7660的包,或者是在海康sdk的回调

    2025年7月6日
    2
  • 图解java反射机制及常用应用场景

    图解java反射机制及常用应用场景一、什么是java反射?二、HelloWorld三、类加载与反射关系四、操作反射的java类五、反射的常用场景六、反射的优缺点

    2025年12月6日
    2
  • java 调用.asmx_Java调用asmx的一个例子

    java 调用.asmx_Java调用asmx的一个例子importjava.util.Vector;importjavax.xml.namespace.QName;importjavax.xml.rpc.ParameterMode;importjavax.xml.rpc.encoding.XMLType;importorg.apache.axis.client.Call;importorg.apache.axis.client.Servi…

    2022年6月7日
    25
  • 记一次遇到挖矿程序的经历「建议收藏」

    记一次遇到挖矿程序的经历「建议收藏」就在几天前,遇到了一次挖矿程序偷偷装在ECS阿里云服务器上的经历。那是一个风和日丽的上午,我和往常一样来到公司,倒杯水等待电脑打开,之后打开日常维护的几个系统。结果其中有一个OA系统,发现无法正常打开。一开始我以为是网络问题,但是发现打开其他网站正常,于是登上服务器准备探个究竟。登陆云服务器后,重启OA服务,发现报错,报错提示连接线程池连接不上。根据提示,怀疑是连不上部署在本地的数据服…

    2022年4月20日
    42

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号