//采用回溯法
public class Solution {
    public boolean hasPath(char[] matrix, int rows, int cols, char[] str)
    {
        //边界条件
        if(matrix==null||matrix.length==0||rows<=0||cols<=0||str.length==0||str==null||(rows*cols)!=matrix.length){
            return false;
        }
        //标记数组,记录节点是否被访问,初始化都是为false
        boolean[] isVisited=new boolean[matrix.length];
        //遍历矩阵
        for(int i=0;i<rows;i++){
            for(int j=0;j<cols;j++){
                //递归
                if(judge(matrix,rows,cols,i,j,isVisited,str,0)){
                    return true;
            }
        }
    }
        return false;
}
    //定义judge()方法判断从字符串的第一个字符开始
    //i,j分别表示当前索引的位置
    private boolean judge(char[] matrix,int rows,int cols,int i,int j,boolean[] isVisited,char[] str,int k){
        int index=i*cols+j;
        //递归终止条件
        if(i<0||j<0||i>=rows||j>=cols||matrix[index]!=str[k]||isVisited[index]==true){
            return false;
        }
        //递归返回值
        if(k==str.length-1){
            return true;
        }
        //第一个被访问的标记
        isVisited[index]=true;
        //访问index的相邻节点
        if(judge(matrix,rows,cols,i-1,j,isVisited,str,k+1)||
          judge(matrix,rows,cols,i+1,j,isVisited,str,k+1)||
          judge(matrix,rows,cols,i,j-1,isVisited,str,k+1)||
          judge(matrix,rows,cols,i,j+1,isVisited,str,k+1)){
            return true;
        }
        //如果相邻的节点不同
        isVisited[index]=false;
        return false;
    }
}