import java.util.*;


public class Solution {
    /**
     * 遍历每个位置当起点试试
     终止条件:到矩阵边界,下一个字符与该位置字符不符合
     返回值:每条查询路径是否有这样的字符串,true,false
     子问题:检查该位置字符与字符串中该字符是否相同,并向它四个相邻方向延申子问题。
     将已经访问过的位置标记为&,避免重复访问。
     * 
     * @param matrix char字符型二维数组 
     * @param word string字符串 
     * @return bool布尔型
     */
    public boolean hasPath (char[][] matrix, String word) {
        // write code here
        //if(matrix.length==0||matrix[0].length==0) return false;
        //从每个起点进行递归
        for(int i=0;i<matrix.length;i++){
            for(int j=0;j<matrix[0].length;j++){
               if(isPath(matrix,word,i,j,0))return true;
               
            }
        }
        return false;
    }

    //子函数,传参,字符串遍历的位置,矩阵位置,字符串,矩阵

    public boolean isPath(char[][] matrix,String word,int i,int j,int index){

        //终止条件:成功
        if(index==word.length()){
            return true;
        }
        //到边界
        if(i<0||i>=matrix.length||j<0||j>=matrix[0].length) return false;

        //搜索过该位置也不行
        if(matrix[i][j]=='&') return false;

        if(word.charAt(index)==matrix[i][j]){
            //搜索附近四个方向查看是否匹配
            char tmp = matrix[i][j];
            matrix[i][j] ='&';
            boolean res = isPath(matrix,word,i-1,j,index+1)||
            isPath(matrix,word,i+1,j,index+1)||
            isPath(matrix,word,i,j-1,index+1)||
            isPath(matrix,word,i,j+1,index+1);
            //回溯,结束之后
            matrix[i][j] = tmp;
            //返回结果
            return res;
        }

        return false;
    }
}