- 分析
凡是有决策树的都可以使用回溯来做,开始想把traverse函数写成回溯函数,但是它不具有决策树,要把有决策树的部分拿出来。 - 代码
class Solution {
public:
vector<vector<char>> board;
vector<vector<bool>> judge;
vector<int> dir{-1, 0, 1, 0, -1};
int m;
int n;
bool exist(vector<vector<char>>& board, string word) {
this -> board = board;
this -> m = board.size();
this -> n = board[0].size();
vector<vector<bool>> judge(m, vector(n, false));
this -> judge = judge;
return traverse(0, 0, 0, word);
}
bool traverse(int row, int col, int start, string& word){
for(int i = row; i < m; i++){
for(int j = col; j < n; j++){
if(judge[i][j] || board[i][j] != word[start]){
continue;
}
if(backtrack(i, j, start, word)){
return true;
}
}
}
return false;
}
bool backtrack(int row, int col, int start, string& word){
if(start == word.length()) return true;
if(row < 0 || col < 0 || row >= m || col >= n || word[start] != board[row][col] || judge[row][col]) return false;
judge[row][col] = true;
if(backtrack(row - 1, col, start + 1, word) || backtrack(row + 1, col, start + 1, word) ||
backtrack(row , col+1, start + 1, word) || backtrack(row, col-1, start + 1, word)) return true;
judge[row][col] = false;
return false;
}
};