本题是挺标准的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;
}

京公网安备 11010502036488号