class Solution {
public:
int m, n;
bool dfs(vector<vector<char>> & board, int i, int j, string & word, int cur) {
if (cur >= word.size())
return true;
if (i < 0 || j < 0
|| i >= m || j >= n
|| board[i][j] == '#'
|| board[i][j] != word[cur])
return false;
board[i][j] = '#';
bool res = dfs(board, i - 1, j, word, cur + 1)
|| dfs(board, i + 1, j, word, cur + 1)
|| dfs(board, i, j - 1, word, cur + 1)
|| dfs(board, i, j + 1, word, cur + 1);
board[i][j] = word[cur];
return res;
}
bool exist(vector<vector<char>>& board, string word) {
if (!word.size()) return false;
m = board.size(), n = board[0].size();
for (int i = 0; i < m; i++)
for (int j = 0; j < n; j++)
if (dfs(board, i, j, word, 0))
return true;
return false;
}
};