/**
 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
 *
 *
 * @param matrix char字符型二维数组
 * @param matrixRowLen int matrix数组行数
 * @param matrixColLen int* matrix数组列数
 * @param word string字符串
 * @return bool布尔型
 */

static int row, col, len, k;

void dfs(char** matrix, char* word, int i, int j) {
    char temp = matrix[i][j];
    matrix[i][j] = '.';
    k++;
    if (k == len) {
        return;
    }
    if (i - 1 >= 0 && matrix[i - 1][j] == word[k] && k < len) {
        dfs(matrix, word, i - 1, j);
    }
    if (j - 1 >= 0 && matrix[i][j - 1] == word[k] && k < len) {
        dfs(matrix, word, i, j - 1);
    }
    if (i + 1 < row && matrix[i + 1][j] == word[k] && k < len) {
        dfs(matrix, word, i + 1, j);
    }
    if (j + 1 < col && matrix[i][j + 1] == word[k] && k < len) {
        dfs(matrix, word, i, j + 1);
    }
    if (k == len) {
        return;
    }
    k--;
    matrix[i][j] = temp;
}

bool hasPath(char** matrix, int matrixRowLen, int* matrixColLen, char* word ) {
    // write code here
    if(word==NULL){
        return true;
    }
    if(matrixRowLen==0||*matrixColLen==0){
        return false;
    }
    row = matrixRowLen;
    col = *matrixColLen;
    len = strlen(word);
    int i, j;
    k = 0;
    for (i = 0; i < row; i++) {
        for (j = 0; j < col; j++) {
            if (matrix[i][j] == word[k]) {
                dfs(matrix, word, i, j);
                if (k == len)return true;
            }
        }
    }
    return false;
}