回溯/C++
迷宫问题
https://www.nowcoder.com/practice/cf24906056f4488c9ddb132f317e03bc
/* 回溯/DFS */ #include <iostream> #include <iterator> #include <vector> using namespace std; //方向矩阵 int dir_x[4] = {0, 0, 1, -1}; int dir_y[4] = {1, -1, 0, 0}; vector<vector<int> >best_track; void backtrack(vector<vector<int>>& nums, vector<vector<int> > & track, vector<vector<int>>& visited, int x, int y, int n, int m){ //记录结果 if(x == n-1 && y == m-1){ for(int i = 0; i < track.size();i++) best_track.push_back(track[i]); //只有一个结果也可以直接在这儿输出 return; } for(int i = 0; i < 4; i++){ int x_new = x + dir_x[i]; int y_new = y + dir_y[i]; if(x_new >=0 && x_new < n && y_new >=0 && y_new < m && visited[x_new][y_new] == 0 && nums[x_new][y_new] == 0){//n和m写反了 track.push_back(vector<int>{x_new, y_new}); visited[x_new][y_new] = 1; backtrack(nums, track, visited, x_new, y_new, n, m); visited[x_new][y_new] = 0; track.pop_back(); } } } void puzzle(vector<vector<int>>& nums, int n, int m){ vector<vector<int> > track; vector<vector<int> > visited(n, vector<int>(m, 0)); visited[0][0] = 1; track.push_back(vector<int>{0,0}); backtrack(nums, track,visited, 0, 0, n, m); for(auto& tmp: best_track){ cout<<"("<<tmp[0]<<","<<tmp[1]<<")"<<endl; } } int main() { int n, m; // vector<vector<int>> nums(n, vector<int>(m, 0));//m和n还没给呢,放这儿干嘛 while(cin>>n>>m){ vector<vector<int>> nums(n, vector<int>(m, 0)); for(int i = 0; i < n; i++){ for(int j = 0; j < m; j++){ cin>>nums[i][j]; } } puzzle(nums,n,m); } return 0; } // 64 位输出请用 printf("%lld")