题解 | #迷宫问题#

迷宫问题

http://www.nowcoder.com/practice/cf24906056f4488c9ddb132f317e03bc

比较经典的回溯问题

主程序调用回溯算法,为了避免回溯函数中参数过多,可以将部分参数设置为全局

以下是我的解答

#include <vector>

using namespace std;

bool findPath(int i, int j, vector<vector<int>>& path, vector<vector<int>>& vin, vector<vector<bool>>& isvisited);
vector<vector<int>> dirs = {{0,1}, {0,-1}, {1,0}, {-1,0}};


int main(){
    int n, m;
    cin >> n >> m;
    vector<vector<int>> vin(n, vector<int>(m, 0));
    while(cin){
        for(int i=0; i<n; i++){
            for(int j=0; j<m; j++){
                cin >> vin[i][j];
            }
        }
    }
    auto printij = [&](int i, int j){
        cout << '(' << i << ',' << j << ')' << endl;
    };
    vector<vector<int>> path;
    path.push_back({0,0});
    vector<vector<bool>> isvisited(n, vector<bool>(m, false));
    
    findPath(0, 0, path, vin, isvisited);
    for(auto& x : path){
        printij(x[0], x[1]);
    }
    

    return 0;
}

bool findPath(int i, int j, vector<vector<int>>& path, vector<vector<int>>& vin, vector<vector<bool>>& isvisited){
    if(i==vin.size()-1 && j==vin[0].size()-1){
        return true;
    }
    // path.push_back({i,j});
    for(auto& x : dirs){
        int nexti = i + x[0];
        int nextj = j + x[1];
        if(nexti>=0 && nexti<vin.size() && nextj>=0 && nextj<vin[0].size() && !isvisited[nexti][nextj]){
            if(vin[nexti][nextj]==0){
                path.push_back({nexti,nextj});
                isvisited[nexti][nextj] = true;
                if(findPath(nexti, nextj, path, vin, isvisited)){
                    return true;
                }
                path.pop_back();
                isvisited[nexti][nextj] = false;
            }
        }
    }
    return false;
    
}

全部评论

相关推荐

头像
11-06 10:58
已编辑
门头沟学院 嵌入式工程师
双非25想找富婆不想打工:哦,这该死的伦敦腔,我敢打赌,你简直是个天才,如果我有offer的话,我一定用offer狠狠的打在你的脸上
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务