解题思路:
(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;
}