class Solution {
public:
bool exist(vector<vector<char>>& board, string word) {
rows = board.size();
cols = board[0].size();
for (int i = 0; i < rows; i++) {
for (int j = 0; j < cols; j++) {
if (dfs(board, word, i, j, 0))
return true;
}
}
return false;
}
private:
int rows, cols;
bool dfs(vector<vector<char>>& board, string word, int i, int j, int k) {
// 判断是否满足条件
if (i >= rows || i < 0 || j >= cols || j < 0 ||
board[i][j] != word[k]) {
return false;
}
// 用 k来 遍历word
if (k == word.size() - 1) {
return true;
}
// 选择当前 i,j 就是 work[k] 只选择符合要求的。
board[i][j] = '\0';
bool res;
res = dfs(board, word, i + 1, j, k + 1) ||
dfs(board, word, i, j - 1, k + 1) ||
dfs(board, word, i - 1, j, k + 1) ||
dfs(board, word, i, j + 1, k + 1);
// 回溯
// 不选择当前的;
board[i][j] = word[k];
return res;
}
};
// 注意 当for循环无法找出规律时,使用 || 同时运行多个函数
// 选择与不选择 '\0' 的处理
res = dfs(board, word, i + 1, j, k + 1) || dfs(board, word, i, j-1, k + 1) || dfs(board, word, i-1, j, k + 1) || dfs(board, word, i, j+1, k + 1);