回溯法

    public boolean hasPath (char[][] matrix, String word) {
        // write code here
        if (word == null || word.length() == 0 || matrix == null || matrix.length == 0){
            return false;
        }

        int m = matrix.length;
        int n = matrix[0].length;

        boolean[][] isVisited = new boolean[m][n];

        for (int i = 0; i < m; i++) {
            for (int j = 0; j < n; j++) {

                if (matrix[i][j] == word.charAt(0) && dfs(matrix,word,isVisited,i,j)){
                    return true;
                }
            }
        }

        return false;
    }

    private int[][] dirs = {{1,0},{-1,0},{0,1},{0,-1}};
    private boolean dfs(char[][] matrix, String word,boolean[][] isVisted,int row,int col){

        if (word.length() == 0){
            return true;
        }

        if (row >= matrix.length || row < 0
                || col >= matrix[0].length || col < 0
                || isVisted[row][col] || word.charAt(0) != matrix[row][col]){
            return false;
        }

        isVisted[row][col] = true;

        for (int[] dir : dirs) {

            if (dfs(matrix,word.substring(1),isVisted,row+dir[0],col+dir[1])){
                return true;
            }

        }
        // 回溯时的状态清除
        isVisted[row][col] = false;
        return false;
    }