迷宫问题

迷宫问题

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

这道题很简单,其实可以简化成树的层序遍历(或图的广度优先遍历),唯一难点就是记录路径。把迷宫抽象成一个起点为根的树。

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

int main(){
    int n, m;
    int t[4][2] = {{-1,0}, {0,-1}, {1,0},{0,1}};
    int v[12][12];
    while(cin >> n >> m)
    {
        vector<pair<int,int> > r;
        stack<pair<int,int> > s;
        fill(v[0], v[0]+12*12, 1);
        for(int i = 1; i <= n; i++)
            for(int j = 1; j <= m; j++)
                cin >> v[i][j];
        s.push(make_pair(1,1));
        v[1][1] = 1;
        while(!s.empty())
        {
            pair<int, int> p = s.top();
            s.pop();
            for(int i = 0; i < 4; i++){ // 上下左右4点
                int x = p.first + t[i][0];
                int y = p.second + t[i][1];
                if(v[x][y] == 0) { // 0说明该点能走,但未被访问过
                    v[x][y] = p.first * 100 + p.second; // 用于记录路径的上个点
                    if(x == n && y == m) break; //  到达终点跳出
                    s.push(make_pair(x,y));
                }
            }
        }
        for (int x = n, y = m, t = v[n][m]; v[x][y] != 1; x = t/100, y = t%100)
        {
            t = v[x][y];
            r.push_back(make_pair(x, y));
        }
        r.push_back(make_pair(1, 1));
        reverse(r.begin(), r.end());
        for(int i = 0; i < r.size(); i++)
        {
            cout << '(' << r[i].first-1 << ',' << r[i].second-1 << ')' << endl;
        }
    }
    return 0;
}

https://github.com/ultraji/nowcoder

全部评论
把t[4][2]里的上左下右顺序一换,这个代码就跑不过测试用例了
点赞 回复 分享
发布于 2021-04-07 17:17
太妙了这个路径记录方法
点赞 回复 分享
发布于 2021-06-14 18:43
哥,你这是深度优先搜索遍历把
点赞 回复 分享
发布于 2022-04-21 10:00

相关推荐

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