回溯
class Solution {
public:
vector<vector<int>> visit;
int row = 0;
int col = 0;
const int d[5] = {0, -1, 0, 1, 0};
bool isvalid(int x, int y){
return x >=0 && x < row && y >= 0 && y < col;
}
bool dfs(vector<vector<char>>& board, string word, int x, int y, int k){
if(board[x][y] != word[k]) return false;
if(k == word.size() - 1) return true;
for(int j = 0; j < 4; ++j){
int x_ = x + d[j], y_ = y + d[j+1];
if(isvalid(x_, y_) && visit[x_][y_] == 0){
visit[x_][y_] = 1;
bool t = dfs(board, word, x_, y_, k+1);
visit[x_][y_] = 0;
if(t == true) return true;
}
}
return false;
}
bool exist(vector<vector<char>>& board, string word) {
int m = board.size();
int n = board[0].size();
if(word.size() > m * n) return false;
row = m;
col = n;
bool res = false;
visit.resize(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] && visit[i][j] == 0){
visit[i][j] = 1;
res = dfs(board, word, i, j, 0);
visit[i][j] = 0;
if(res == true) return true;
}
}
}
return res;
}
};