题解 | #迷宫问题# DFS回溯

迷宫问题

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

#include <iostream>
#include <vector>
using namespace std;

bool dfs(vector<vector<int>>& res, vector<vector<int>>& maze, int i, int j) {
    int m = maze.size(), n = maze[0].size();
    // 索引不满足条件,返回false
    if (i < 0 || i >= m || j < 0 || j >= n || maze[i][j]) {
        return false;
    }
    // 将当前索引加入result数组
    res.push_back({i, j});
    // 将当前状态置为1,表示已访问过
    maze[i][j] = 1;
    // 访问到终点,返回true
    if (i == m - 1 && j == n - 1) {
        return true;
    }
    // 遍历四个方向,如果有一个方向为true,表示存在有效路径
    if (dfs(res, maze, i - 1, j) || dfs(res, maze, i + 1, j) ||
            dfs(res, maze, i, j - 1) || dfs(res, maze, i, j + 1)) {
        return true;
    }
    // 不存在有效路径,将当前索引弹出
    res.pop_back();
    // 状态置0,表示可以重新访问
    maze[i][j] = 0;
    return false;
}

int main() {
    int m, n;
    cin >> m >> n;
    vector<vector<int>> maze(m, vector<int>(n, 0));
    for (int i = 0; i < m; i++) {
        for (int j = 0; j < n; j++) {
            cin >> maze[i][j];
        }
    }
    vector<vector<int>> res;
    // dfs遍历
    dfs(res, maze, 0, 0);
    for (int i = 0; i < res.size(); i++) {
        cout << "(";
        for (int j = 0; j < res[i].size(); j++) {
            cout << res[i][j];
            if (j != res[i].size() - 1) {
                cout << ",";
            }
        }
        cout << ")" << endl;
    }
}
// 64 位输出请用 printf("%lld")

全部评论

相关推荐

10-29 18:20
济南大学 Java
王233:名字说一下
点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

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