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;    // 回溯法
        }
    }

};

模版哼重要!!!

需要注意的点是为啥需要回溯?

  • 能走到回溯那段代码,第一意味着目前没有满足答案的路径,第二说明前后前后左右都没有满足条件的,所以,需要释放这个节点。