class Solution {
private:
    bool res = false;
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param board string字符串vector 
     * @param word string字符串 
     * @return bool布尔型
     */
    bool exist(vector<string>& board, string word) {
        // write code here
        int m=board.size(), n=board[0].length();
        vector<vector<int>> vis(m, vector<int>(n, 0));
        
        for(int i=0; i<m; i++){
            for(int j=0; j<n; j++){
                if(board[i][j] == word[0]){
                    dfs(board, vis, word, 0, m, n, i, j);
                }
                if(res == true){
                    return res;
                }
            }
        }
        return res;
    }
    
    void dfs(vector<string>& board, vector<vector<int>>& vis,
             string word, int cur, int m, int n, int x, int y){
        if(cur >= word.length()){
            res = true;
            return;
        }
        if(res == true){
            return;
        }
        
        if(x<0 || x>=m || y<0 || y>=n){
            return;
        }
        
        if(vis[x][y] == 1){
            return;
        }
        
        if(board[x][y] != word[cur]){
            return;
        }
        
        cur += 1;
        vis[x][y] = 1;
        
        dfs(board, vis, word, cur, m, n, x+1, y);
        dfs(board, vis, word, cur, m, n, x-1, y);
        dfs(board, vis, word, cur, m, n, x, y+1);
        dfs(board, vis, word, cur, m, n, x, y-1);
        cur -= 1;
        vis[x][y] = 0;
    }
    
};