回溯/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")

全部评论

相关推荐

04-10 11:56
如皋中学 Java
高斯林的信徒:双c9能简历挂的?
点赞 评论 收藏
分享
哥_留个offer先:跟他说,你这个最好用c#,微软就用c#Java不适合这个项目
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务