迷宫问题(C++牛客网)

解题思路:

(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;
}

猜你喜欢

转载自blog.csdn.net/coolsunxu/article/details/115008071