本题是挺标准的DFS加上回溯的问题。有几个关键点需要注意:1. 如何比较方便的记录走过个点的x y坐标,可以采用vector<pait<int,int>>来记录,比较方便;2. 如果对已经走过的格点进行标记,比较节省空间的做法是,对于已经走过的节点在DFS之前将其赋值为1,以防下一次搜索的时候重复走过,但是在回溯的时候注意要将其重新置回0。
#include<iostream> #include<vector> using namespace std; vector<pair<int,int>> res; void backtracking(vector<vector<int>> &maze, int row, int col, vector<pair<int, int>> &path) { vector<int> dict{ -1, 0, 1, 0, -1 }; if (row == maze.size() - 1 && col == maze[0].size() - 1) { path.push_back(make_pair(row, col)); res = path; return; } if (maze[row][col] == 0) { path.push_back(make_pair(row, col)); for (int n = 0; n < 4; n++) { int x = row + dict[n]; int y = col + dict[n + 1]; if (x >= 0 && x < maze.size() && y >= 0 && y < maze[0].size() && maze[x][y] == 0) { maze[row][col] = 1; backtracking(maze, x, y, path); // 回溯 path.pop_back(); maze[row][col] = 0; } } } } int main(){ int m = 0, n = 0; cin >> n >> m; vector<vector<int>> maze(n, vector<int>(m, 0)); for (int i = 0; i < n; i++) { for (int j = 0; j < m; j++) { int temp = 0; cin >> temp; maze[i][j] = temp; } } vector<pair<int,int>> path; backtracking(maze, 0, 0, path); // 输出 int len = res.size(); for (vector<pair<int, int>>::iterator iter = res.begin(); iter != res.end(); iter++) { auto temp = *iter; int x = temp.first; int y = temp.second; cout << "(" << x << "," << y << ")" << endl; } return 0; }