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


相关推荐

  • android 苹果 换机,苹果12怎么一键换机安卓?iPhone12一键换机功能操作步骤

    android 苹果 换机,苹果12怎么一键换机安卓?iPhone12一键换机功能操作步骤苹果12怎么从安卓一键换机?相信有很多朋友最近新购了iPhone12,但是原来安卓手机中有不少的联系人和文件资料,要是手动来备份还原,那就太麻烦了,所以这时候就需要用到一键换机功能了。下面我们就为大家带来了苹果12电脑端和手机端的一键换机教程,一起来看看吧!苹果12怎么一键换机安卓?iPhone12一键换机功能操作步骤苹果一键换机功能怎么操作1、使用QQ同步助手换机,我们可以在原来安卓或者旧苹果手…

    2022年5月26日
    116
  • goland 激活码 2021[在线序列号]

    goland 激活码 2021[在线序列号],https://javaforall.net/100143.html。详细ieda激活码不妨到全栈程序员必看教程网一起来了解一下吧!

    2022年3月18日
    47
  • SparkStreaming的介绍及原理

    SparkStreaming的介绍及原理一、SparkStreaming的介绍1.离线和流处理的区别1)离线处理是针对一个批次,这个批次一般情况下都比较大流处理对应的数据是连续不断产生,处理时间间隔非常短的数据2)离线处理程序,因为数据是有限的(bounded),所以会终止流数据因为是连续不断的产生,所以数据是无限的(unbounded)由于数据的特征,一般离线处理比较缓慢,流数据处理相对较快流处理:…

    2022年6月20日
    38
  • AUC的公式_蔡勒公式

    AUC的公式_蔡勒公式AUC:随机抽出一对样本(一个正样本,一个负样本),然后用训练得到的分类器来对这两个样本进行预测,预测得到正样本的概率大于负样本概率的概率。开始抽样:在有M个正样本,N个负样本的数据集里。一共有MN对样本(一对样本即,一个正样本与一个负样本)。统计这MN对样本里,正样本的预测概率大于负样本的预测概率的个数。计算:(一)2个正样本:C,D2个负样本:A,B样本对:(C,A)(C,B…

    2022年10月21日
    3
  • bwapp xss stored_babassl

    bwapp xss stored_babassl0x01、XSS-Reflected(GET)Low输入的内容直接输出到页面中:后台服务端没有对输入的参数进行过滤,直接任选一个注入xsspayload即可:<script>alert(1)</script>Medium虽然服务端进行了过滤,但只是addslashes()函数而已(防sql注入),依旧可以xss:…

    2022年9月23日
    2
  • PS2手柄遥控Arduino小车[通俗易懂]

    PS2手柄遥控Arduino小车[通俗易懂]使用手柄遥控小车是经常要用到的,看到PS2手柄很6,就拿来尝试一下。PS2手柄是索尼的PlayStation2游戏机的遥控手柄,因为这款手柄性价比较高,按键丰富,方便扩展到其它应用中,后来有人将其通讯协议破解,使得手柄可以用在遥控其他电器上,比如遥控控制机器人小车。最主要的是这款手柄,拿来就可以用,有人已经将其通讯协议破解了。具体可以参考极客工坊。其PS2X_lib库,可以参见Github

    2022年6月14日
    42

发表回复

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

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