import java.util.*;


public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param matrix char字符型二维数组 
     * @param word string字符串 
     * @return bool布尔型
     */
    public boolean hasPath (char[][] matrix, String word) {
        // write code here
        int n = matrix.length;
        if (0 == n) {
            return false;
        }
        int m = matrix[0].length;
        if (0 == m) {
            return false;
        }
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < m; j++) {
                char chr = matrix[i][j]; // 获取一个字符
                if (chr == word.charAt(0)) {
                    if (process(matrix, word, i, j, 0)) {
                        return true;
                    }
                }
            }
        }
        return false;
    }
    
    public boolean process(char[][] matrix, String word, int x, int y, int index) {
        if (x < 0 || x >= matrix.length || y < 0 || y >= matrix[0].length || index >= word.length() || matrix[x][y] != word.charAt(index)) { // 终止条件
            return false;
        }
        char chr = matrix[x][y]; // 记录当前位置上的字符,便于后续回溯
        matrix[x][y] = '#'; // 赋予当前位置一个特殊字符,表示当前位置已经访问过
        if (index == word.length() - 1) { // 如果此时已经在匹配到最终的位置了,证明已经找到了
            return true;
        }
        boolean u = process(matrix, word, x - 1, y, index + 1);
        boolean d = process(matrix, word, x + 1, y, index + 1);
        boolean l = process(matrix, word, x, y - 1, index + 1);
        boolean r = process(matrix, word, x, y + 1, index + 1);
        matrix[x][y] = chr; // 别忘了进行回溯
        return u || d || l || r;
    }
}