剑指offer 12 矩阵中的路径
本题的算法思路一开始不清楚
public class Solution { public static boolean hasPath(char[] matrix, int rows, int cols, char[] str) { if(str.length==0) return false; boolean [][] marked=new boolean[rows][cols]; for(int i=0;i<rows;i++){ for(int j=0;j<cols;j++){ marked[i][j]=false; } } char [][]data=buildmatrix(matrix,rows,cols); for(int i=0;i<rows;i++){ for(int j=0;j<cols;j++){ if(pathExit(data,marked,i,j,str,0)){ return true; } } } return false; } public static boolean pathExit(char [][]matrix,boolean [][] visit,int i,int j,char[]str,int count){ int row=matrix.length; int col=matrix[0].length; //这个if语句debug了很久... matrix[i][j]!=str[count]需要放在i j是否出界后再判断,要不会数组越界 //因为无法保证matrix[i][j]中的i j是否合法!! if(i<0 || j<0 || i>row-1 || j>col-1 || matrix[i][j]!=str[count]||visit[i][j]==true){ return false; } if(count==str.length-1&&matrix[i][j]==str[count]) return true; visit[i][j]=true; boolean res=pathExit(matrix,visit,i,j+1,str,count+1)||pathExit(matrix,visit,i,j-1,str,count+1)|| pathExit(matrix,visit,i+1,j,str,count+1)||pathExit(matrix,visit,i-1,j,str,count+1); visit[i][j]=false;//记得重置visit数组 return res;//返回的是下面的字符能否组成str,一层一层向上返回 } public static char[][] buildmatrix(char []array, int row, int col){ char [][]matrix=new char[row][col]; for(int i=0;i<row;i++){ for(int j=0;j<col;j++){ matrix[i][j]=array[col*i+j];//如何计算取出char元素的下标需要注意 } } return matrix; } }