面试题十二:矩阵中的路径
判断矩阵中是否存在一条包含某字符串所有字符的路径。路径可以从矩阵中任意一格开始,向左右上下移动,路径不重复
方法:递归回溯,回溯法适合又多个步骤组成的问题
boolean hasPath( char [][] matrix, int rows ,int cols,char[] str){ if(matrix==null || rows<1||cols<1|| str==null) return false; int[][] boolary=new int [rows][cols]; //作为位置标示符,可不可走 int lengthPath=0; //遍历数组,每个元素都能为开头 for(int i=0;i<rows;i++) for(int j=0;j<cols;j++) if( f1 (matrix, rows, cols, i, j, str,lengthPath, boolary) ) return true; return false; } boolean f1(char [][] matrix, int rows ,int cols, int i, int j,char[ ] str, int lengthPath, int [][]boolary) { if(lengthPath>=str.length) //说明是否能匹配到字符串尾部 return true; boolean hasPath=false; //标示符 //当前位置,下标不越界, 下标能比较,下标与字符串值匹配, if(i>=0 && i<rows && j>=0 && j<cols && matrix[ i ] [ j] ==str[ lengthPath] && boolary[i][j] ==0) { lengthPath++; //比较下一个字符1 boolary[ i ] [ j]=1; //防止被再次匹配 } //按顺序左右上下比较,有一个方向找到就返回真 hasPath= f1(matrix, rows, cols, i, j-1, str, lengthPath, boolary) ||f1(matrix, rows, cols, i, j+1, str, lengthPath, boolary) || f1(matrix, rows, cols, i-1, j, str, lengthPath, boolary) || f1(matrix, rows, cols, i+1, j, str, lengthPath, boolary) ; //如果下面的路走不通,则重新比较; if( ! hasPath ){ lengthPath--; boolary[ i ] [ j]=0; } return hasPath; }
浪波激泥