《剑指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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • HDU 1548 A strange lift 搜索[通俗易懂]

    HDU 1548 A strange lift 搜索

    2022年2月1日
    38
  • Visual C++ 2010 Express与Visual C++ 2010有何区别?「建议收藏」

    Visual C++ 2010 Express与Visual C++ 2010有何区别?

    2022年4月3日
    49
  • 简述python中的数字类型有哪些_python中都有哪些数据类型

    简述python中的数字类型有哪些_python中都有哪些数据类型python中数据类型有:整型、长整型、浮点型、字符串类型、布尔类型、列表类型、元组类型、字典类型、集合类型。数据类型是每种编程语言必备属性,只有给数据赋予明确的数据类型,计算机才能对数据进行处理运算,因此,正确使用数据类型是十分必要的,不同的语言,数据类型类似,但具体表示方法有所不同,以下是Python编程常用的数据类型:1.数字类型Python数字类型主要包括int(整型)、long(长整型…

    2022年5月26日
    54
  • Pycharm调试_pycharm 远程调试

    Pycharm调试_pycharm 远程调试动机一些bug由于本地环境和线上环境的不一致可能导致本地无法复现本地依赖和线上依赖版本不一致也可以导致一些问题有时一些bug跟数据相关,本地数据无法和线上数据一致有些三方平台会验证服务器的合法性或者异步回调结果,如微信支付,这时候本地无法测试如上所诉,要是有一个很方便调试远程服务器的方法,岂不美哉。通过PyCharm我们可以很方便地实现远程调试,下面详细介绍下PyCharm这个牛叉的功能。添加远程…

    2025年7月1日
    5
  • md5值是不是哈希值_2000哈希

    md5值是不是哈希值_2000哈希MD5isachecksumorhashcalculationmethodforfiles.MD5checksumconsistsof128-bitvaluewhichisgenerallyexpressedasthehexadecimalformatwithwhichconsistof32characters.MD5是文件的校验和或哈希…

    2025年11月7日
    5
  • 什么叫母函数_母函数和矩母函数

    什么叫母函数_母函数和矩母函数生成函数(母函数)什么是生成函数:wiki上的介绍在数学中,某个序列(an)n∈N\large{\displaystyle(a_{n})_{n\in\mathbb{N}}}(an​)n∈N​的母函数(又称生成函数,英语:Generatingfunction)是一种形式幂级数,其每一项的系数可以提供关于这个序列的信息。使用母函数解决问题的方法称为母函数方法。母函数可分为很多种,包……

    2025年8月19日
    3

发表回复

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

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