剑指offer_矩阵中的路径
判断在一个矩阵中是否存在一条包含某字符串所有字符的路径。路径可以从矩阵中的任意一个格子开始,每一步可以 在矩阵中向上下左右移动一个格子。如果一条路径经过了矩阵中的某一个格子,则该路径不能再进入该格子。
例如下面的矩阵包含了一条 bfce 路径

解题思路
使用回溯法(backtracking)进行求解,它是一种暴力搜索方法,通过搜索所有可能的结果来求解问题。回溯法在一 次搜索结束时需要进行回溯(回退),将这一次搜索过程中设置的状态进行清除,从而开始一次新的搜索过程。例如 下图示例中,从 f 开始,下一步有 4 种搜索可能,如果先搜索 b,需要将 b 标记为已经使用,防止重复使用。在这一 次搜索结束之后,需要将 b 的已经使用状态清除,并搜索 c。

本题的输入是数组而不是矩阵(二维数组),因此需要先将数组转换成矩阵。
1 public class Solution { 2 public final static int [][] next ={{0,-1},{0,1},{-1,0},{1,0}}; 3 private int rows; 4 private int cols; 5 public boolean hasPath(char[] array, int rows, int cols, char[] str) 6 { 7 if(rows==0||cols==0) return false; 8 this.rows=rows; 9 this.cols=cols; 10 boolean [][] marked = new boolean[rows][cols]; 11 char[][] matrix = buildMatrix(array); 12 for(int i=0;i< rows;i++){ 13 for(int j=0;j<cols;j++){ 14 if(backtracking(matrix,str,marked,0,i,j)) return true; 15 } 16 } 17 return false; 18 } 19 20 public boolean backtracking(char[][] matrix,char[] str,boolean [][] marked,int pathLen,int r,int c) 21 { 22 if(pathLen==str.length) return true; 23 if(r<0||r>=rows||c<0||c>=cols||marked[r][c]||matrix[r][c]!=str[pathLen]){ 24 return false; 25 } 26 marked[r][c]=true; 27 for(int [] n : next){ 28 if(backtracking(matrix,str,marked,pathLen+1,r+n[0],c+n[1])) return true; 29 } 30 marked[r][c]=false; 31 return false; 32 } 33 34 35 36 public char[][] buildMatrix(char[] array){ 37 char[][] matrix=new char[rows][cols]; 38 for(int r=0,idx=0;r<rows;r++){ 39 for(int c=0;c<cols;c++){ 40 matrix[r][c]=array[idx++]; 41 } 42 } 43 return matrix; 44 } 45 46 }

浙公网安备 33010602011771号