题解 | #迷宫问题#

迷宫问题

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

#include <iostream>
#include <vector>
#include <string>

std::vector<std::string> pathList;
using namespace std;
bool search(const std::vector<std::vector<bool>>& maze, int m, int n, int i,
            int j, std::vector<std::vector<bool>>& visited) {
    visited[i][j] = true;
    if (i == m - 1 && j == n - 1) {
        pathList.push_back("(" + std::to_string(i) + "," + std::to_string(j) + ")");
        return true;
    }
    int newI, newJ;
    bool accessable;
    // go up
    if (i - 1 >= 0 && maze[i - 1][j] && !visited[i - 1][j]) {
        newI = i - 1;
        newJ = j;
        accessable = search(maze, m, n, newI, newJ, visited);
        if (accessable) {
            pathList.push_back("(" + std::to_string(i) + "," + std::to_string(j) + ")");
            return true;
        }
    }
    // go down
    if (i + 1 < m && maze[i + 1][j] && !visited[i + 1][j]) {
        newI = i + 1;
        newJ = j;
        accessable = search(maze, m, n, newI, newJ, visited);
        if (accessable) {
            pathList.push_back("(" + std::to_string(i) + "," + std::to_string(j) + ")");
            return true;
        }
    }
    // go left
    if (j - 1 >= 0 && maze[i][j - 1] && !visited[i][j - 1]) {
        newI = i;
        newJ = j - 1;
        accessable = search(maze, m, n, newI, newJ, visited);
        if (accessable) {
            pathList.push_back("(" + std::to_string(i) + "," + std::to_string(j) + ")");
            return true;
        }
    }
    // go right
    if (j + 1 < n && maze[i][j + 1] && !visited[i][j + 1]) {
        newI = i;
        newJ = j + 1;
        accessable = search(maze, m, n, newI, newJ, visited);
        if (accessable) {
            pathList.push_back("(" + std::to_string(i) + "," + std::to_string(j) + ")");
            return true;
        }
    }
    return false;
}

int main() {
    int m, n;
    std::cin >> m >> n;

    std::vector<std::vector<bool>> maze(m, std::vector<bool>(n));
    std::vector<std::vector<bool>> visited(m, std::vector<bool>(n, false));

    for (int i = 0; i < m; ++i) {
        for (int j = 0; j < n; ++j) {
            int temp;
            std::cin >> temp;
            maze[i][j] = (temp == 0);
        }
    }

    search(maze, m, n, 0, 0, visited);

    for (auto x = pathList.end()-1;x>=pathList.begin();x--) {
        cout<<*x<<endl;
    }

    return 0;
}

全部评论

相关推荐

评论
点赞
收藏
分享
牛客网
牛客企业服务