import java.util.*;


public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param matrix char字符型二维数组 
     * @param word string字符串 
     * @return bool布尔型
     */
    public boolean hasPath (char[][] matrix, String word) {
        char[] arr = word.toCharArray() ;
        //标记
        boolean[][] isvisit = new boolean[matrix.length][matrix[0].length] ;
        //从每一个点出发去找
        for(int i = 0 ; i < matrix.length ; i ++) {
            for(int j = 0 ; j < matrix[0].length ; j ++) {
                //只有起点相同才有找下去的必要
                if(matrix[i][j] == word.charAt(0)) {
                    //找到立即返回
                    if(dfs(matrix,i,j,arr,0,isvisit)) {
                        return true ;
                    }
                }
            }
        }
        return false ;
    }
    
    /*
    从map[i][j]出发 能不能找到 word[index]及其以后的字符序列
    */
    public boolean dfs(char[][] map , int i , int j , char[] word , int index,boolean isVisit[][]) {
        if(index == word.length) {
            return true ;
        }
        if(i < 0 || i >= map.length || j < 0 || j >= map[0].length) {
            return false ;
        }
        //若已经找过 直接返回false
        if(isVisit[i][j]) {
            return false ;
        }
        if(map[i][j] != word[index]) {
            return false ;
        } else {
            //标记
            isVisit[i][j] = true ;
            //以当前点的四周每个点为起点再去找
            boolean flag = dfs(map,i-1,j,word,index+1,isVisit)||
                           dfs(map,i+1,j,word,index+1,isVisit)||
                           dfs(map,i,j-1,word,index+1,isVisit)||
                           dfs(map,i,j+1,word,index+1,isVisit) ;
            //解除标记
            isVisit[i][j] = false ;
            return flag ;
        }
        
        
    }
}