解题思路:
(1)回溯法,注意值传递而非址传递
#include<iostream> #include<vector> using namespace std; void helper(vector<pair<int,int>> mp,vector<vector<int>> &vec,vector<vector<int>> &d,vector<vector<int>> &vis,int x,int y) { int m = vec.size(),n=vec[0].size(); mp.push_back({x,y}); vis[x][y]=1; if(x==m-1 && y==n-1) { for(int i=0;i<mp.size();i++) { cout<<'('<<mp[i].first<<','<<mp[i].second<<')'<<endl; } return; } for(int i=0;i<d.size();i++) { if(0<=x+d[i][0] && x+d[i][0]<m && 0<=y+d[i][1] && y+d[i][1]<n && vis[x+d[i][0]][y+d[i][1]]==0 && vec[x+d[i][0]][y+d[i][1]]==0) { helper(mp,vec,d,vis,x+d[i][0],y+d[i][1]); } } return; } int main() { int m,n,a; vector<vector<int>> d={ {1,0},{-1,0},{0,1},{0,-1}}; while(cin>>m) { cin>>n; vector<pair<int,int>> mp; vector<vector<int>> vec; vector<vector<int>> vis(m,vector<int>(n,0)); for(int i=0;i<m;i++) { vector<int> v; for(int j=0;j<n;j++) { cin>>a; v.push_back(a); } vec.push_back(v); } helper(mp,vec,d,vis,0,0); } return 0; } #include<iostream> #include