import java.util.*;

public class Solution {
    public boolean hasPath (char[][] matrix, String word) {
        if (matrix == null || matrix.length == 0 || matrix[0].length == 0)
            return false;
        if (word == null || word.length() == 0) 
            return false;
        int m = matrix.length, n = matrix[0].length;
        char[] wc = word.toCharArray();
        int[][] mark = new int[m][n];
        for (int i = 0; i < m; ++i) {
            for (int j = 0; j < n; ++j) {
                if (has(i, j, matrix, mark, wc, 0)) {
                    return true;
                }
            }
        }
        return false;
    }

    public boolean has(int i, int j, char[][] matrix, int[][] mark,
                       char[] word, int index) {
        if (index == word.length) 
            return true;

        if (i >= matrix.length || i < 0 || j >= matrix[0].length || j < 0) 
            return false;

        boolean hasPath = false;
        if (mark[i][j] == 0 && matrix[i][j] == word[index]) {
            mark[i][j] = 1;
            hasPath = has(i + 1, j, matrix, mark, word, index + 1)
                || has(i - 1, j, matrix, mark, word, index + 1)
                || has(i, j + 1, matrix, mark, word, index + 1)
                || has(i, j - 1, matrix, mark, word, index + 1); 
        } 
        if (!hasPath) { // 关键,如果没有匹配上,要去除mark数组的占位
            mark[i][j] = 0;
        }
        return hasPath;
    }
}