DFS
class Solution {
private:
// 先声明几个要用的变量,方便调用
vector<vector<int> > visited;
int flag = 0;
int row, col;
int str_size;
public:
bool hasPath(vector<vector<char> >& matrix, string word) {
row = matrix.size();
col = matrix[0].size();
str_size = word.size();
visited = vector<vector<int> >(row, vector<int>(col, 0));
for (int i = 0; i < matrix.size(); i++)
for (int j = 0; j < matrix[0].size(); j++) {
if (matrix[i][j] == word[0]) {
// 第一个字母正确的时候,进入dfs
dfs(i, j, 0, word, matrix);
if (flag) {
return true;
}
}
}
return false;
}
void dfs(int x, int y, int cur, string & word, vector<vector<char> > & matrix) {
if (flag) return;
if (x >= 0 && x < row && y >= 0 && y < col && visited[x][y] == 0 && matrix[x][y] == word[cur]) {
if (cur == str_size - 1) {
flag = 1;
return;
}
visited[x][y] = 1;
dfs(x + 1, y, cur+1, word, matrix);
dfs(x, y + 1, cur+1, word, matrix);
dfs(x - 1, y, cur+1, word, matrix);
dfs(x, y - 1, cur+1, word, matrix);
visited[x][y] = 0; // 回溯法
}
}
};
模版哼重要!!!
需要注意的点是为啥需要回溯?
- 能走到回溯那段代码,第一意味着目前没有满足答案的路径,第二说明前后前后左右都没有满足条件的,所以,需要释放这个节点。