import java.util.*;

public class Solution {
    ArrayList<Integer> isvisited = new ArrayList<Integer>();

    public boolean hasPath(char[] matrix, int rows, int cols, char[] str)
    {
        boolean flag = false;
        for (int i = 0; i < matrix.length; i++) {
            if (matrix[i] == str[0]) {
                flag = flag || hasPath2(matrix, rows, cols, str, i, 0);
            }
        }
        return flag;
    }

    public boolean hasPath2(char[] matrix, int rows, int cols, char[] str, int start, int index) {
        boolean flag1 = false, flag2 = false, flag3 = false, flag4 = false;
        isvisited.add(start);
        if (index == str.length - 1) return true;
        int u = up(rows, cols, start);
        if (u != -1 && matrix[u] == str[index + 1])
            flag1 = hasPath2(matrix, rows, cols, str, u, index + 1);
        int d = down(rows, cols, start);
        if (d != -1 && matrix[d] == str[index + 1]) 
            flag2 = hasPath2(matrix, rows, cols, str, d, index + 1);
        int l = left(rows, cols, start);
        if (l != -1 && matrix[l] == str[index + 1]) 
            flag3 = hasPath2(matrix, rows, cols, str, l, index + 1);
        int r = right(rows, cols, start);
        if (r != -1 && matrix[r] == str[index + 1]) 
            flag4 = hasPath2(matrix, rows, cols, str, r, index + 1);
        isvisited.remove(isvisited.size() - 1);
        return flag1 || flag2 || flag3 || flag4;
    }

    public int up(int rows, int cols, int start) {
        int tmp = start - cols;
        if (tmp < 0 || tmp >= rows * cols || isvisited.contains(tmp))
            return -1;
        return tmp;
    }

    public int down(int rows, int cols, int start) {
        int tmp = start + cols;
        if (tmp < 0 || tmp >= rows * cols || isvisited.contains(tmp))
            return -1;
        return tmp;
    }

    public int left(int rows, int cols, int start) {
        int tmp = start - 1;
        if (tmp < 0 || tmp >= rows * cols || isvisited.contains(tmp))
            return -1;
        return tmp;
    }

    public int right(int rows, int cols, int start) {
        int tmp = start + 1;
        if (tmp < 0 || tmp >= rows * cols || isvisited.contains(tmp))
            return -1;
        return tmp;
    }
}