直接使用回溯,用双重for循环,以每一个点为起点,去向四面走,找到符合条件的路径。走过的点用数组进行标记。

public class Solution {
    public boolean hasPath(char[] matrix, int rows, int cols, char[] str)
    {
        int[] flag = new int[matrix.length];
        for(int i = 0; i < rows; i++){
            for(int j = 0; j < cols; j++){
                if(helper(matrix,rows,cols,i,j,flag,0,str))
                    return true;
            }
        }
        return false;
    }

    public boolean helper(char[] matrix, int rows, int cols, int i, int j, int[] flag, int len, char[] str){
        int index = cols*i+j;  // 计算得到当前点在matrix的位置
        if(i<0 || i>=rows || j<0 || j>=cols || matrix[index]!=str[len] || flag[index] == 1) 
            /*超出范围,这个点不是我们想要的,或者这个点已经走过了,就不能再走了,直接返回false*/
            return false;
        // 长度相等的时候,就证明找到了
        if(len == str.length-1)
            return true;
        flag[index] = 1;  // 标记为已经走过了
        /*找到任何一条路径就够了*/
        if(helper(matrix,rows,cols,i-1,j,flag,len+1,str) || helper(matrix,rows,cols,i,j-1,flag,len+1,str) ||
          helper(matrix,rows,cols,i+1,j,flag,len+1,str) || helper(matrix,rows,cols,i,j+1,flag,len+1,str))
            return true;
        flag[index] = 0;  //撤销已经走过的点

        return false;
    }


}