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