题目简述:判断在一个矩阵中是否存在一条路径,该路径顺序包含某字符串所有字符。路径可以从矩阵中的任意一格开始,每一步可以在矩阵中向左、右、上、下移动一格。如果一条路径经过了矩阵的某一格,那么该路径不能再次进入该格子。
java实现如下:
public class Problem12_1 { private static boolean hasPath(char[][] matrix,String string){ int rows=matrix.length; int cols=matrix[0].length; if (matrix==null||rows<1||cols<1||string==""){ return false; } boolean[][] visited=new boolean[rows][cols]; int pathLength=0; for (int row=0;row<rows;row++){ for (int col=0;col<cols;col++){ if (hasPathCore(matrix,rows,cols,row,col,string,pathLength,visited)){ return true; } } } return false; } private static boolean hasPathCore(char[][] matrix,int rows,int cols,int row,int col,String string,int pathLength,boolean[][] visited){ if (pathLength==string.length()){ return true; } boolean hasPath=false; if (row>=0&&row<rows&&col>=0&&col<cols &&matrix[row][col]==string.charAt(pathLength) &&!visited[row][col]){ pathLength++; visited[row][col]=true; hasPath=hasPathCore(matrix,rows,cols,row,col-1,string,pathLength,visited) ||hasPathCore(matrix,rows,cols,row-1,col,string,pathLength,visited) ||hasPathCore(matrix,rows,cols,row,col+1,string,pathLength,visited) ||hasPathCore(matrix,rows,cols,row+1,col,string,pathLength,visited); if (!hasPath){ pathLength--; visited[row][col]=false; } } return hasPath; } public static void main(String[] args) { char[][] matrix={{'a','b','t','g'}, {'c','f','c','s'}, {'j','d','e','h'}}; String string="bfce"; System.out.println(Problem12_1.hasPath(matrix,string)); } }这是学习回溯法的经典题目,我根据书上的思路,用java代码实现了一下。开始喜欢在调试时用笔实现每一个细节,后来发现从一个宏观角度考虑代码思路更好,不过要注意回溯法中的剪枝判断。还要靠多刷题积累经验。