class Solution {
public:
int d[5] = {1,0,-1,0,1};
vector<vector<bool>> visited;
int x_size, y_size;
bool exist(vector<vector<char>>& board, string word) {
x_size = board.size();
y_size = board[0].size();
for (int i=0; i<x_size; i++) {
vector<bool> vs;
for (int j=0; j<y_size; j++) {
vs.push_back(false);
}
visited.push_back(vs);
}
for (int i=0; i<board.size(); i++) {
for (int j=0; j<board[0].size(); j++) {
if (board[i][j] == word[0]) {
if (DFS(word, 0, board, i, j)) {
return true;
}
}
}
}
return false;
}
bool DFS(string word, int index, vector<vector<char>>& board, int x, int y) {
if (index == word.length() - 1) return true;
bool result = false;
visited[x][y] = true;
for (int i=0; i<4; i++) {
if (in_range(x+d[i], y+d[i+1]) && !visited[x+d[i]][y+d[i+1]] &&
word[index+1] == board[x+d[i]][y+d[i+1]]) {
result |= DFS(word, index+1, board, x+d[i], y+d[i+1]);
}
}
visited[x][y] = false;
return result;
}
bool in_range(int x, int y) {
if (x >=0 && x < x_size && y >= 0 && y < y_size) return true;
return false;
}
};