• P2360 地下城主


    题目大意

    背景是逃离(3D)地下监狱,也就是三维样例,你可以前往所在小格的前方,后方,左方,右方,上层,下层的小格,'.'表示可走,'x'表示墙壁,'S'表示起点,'E'表示终点。每走一小格花费一分钟时间,求逃离地下监狱需要的最少时间。(原题链接:P2360 地下城主

    输入格式:

    第一行:(l)表示有多少层,(r)表示一层有多少行,(c)表示一行有多少个
    接下来:(l)个矩阵,表示监狱的每一层

    输出格式:

    一个数:所要花费的最少时间
    如果能成功逃离输出:“(Escaped) (in) (x) (minute(s))”,否则输出“(Trapped!)

    输入样例:

    3 4 5
    S....
    .xxx.
    .xx..
    xxx.x

    xxxxx
    xxxxx
    xx.xx
    xx...

    xxxxx
    xxxxx
    x.xxx
    xxxxE

    输出样例

    Escaped in 11 minute(s).

    思路:

    这道题明显是使用(BFS)的,但是知道用(BFS)平时都是搜索那种两维的,这次是三维的怎么搞,第一想法是压缩成两维,可是真的太抽象了。。。
    于是看了一下题解是说直接把数组改成三维就好了嘛,这样看来,这道题好水啊,,,
    于是我显示用了三个数组

    dx[4] = {-1, 0, 1, 0}
    dy[4] = {0, 1, 0, -1}
    dz[2] = {-1, 1};
    

    然后我又是这样枚举的

    for(int i = 0; i < 4; i++)
          for(int i = 0; i < 2; i++)
                int xx = t.x + dx[i], yy = t.y +dy[i], zz = t.z + dz[j];
    

    然后就爆零了。。
    为什么dist数组根本没有得到更新,调试了一下,发现,我们一次只能做一个动作(前后上下左右,不能直接右上右下这样走),因此发现了问题,把代码改成了这样。

    dx[6] = {-1, 0, 1, 0, 0, 0}
    dy[6] = {0, 1, 0, -1, 0, 0}
    dz[6] = {0, 0, 0, 0, -1, 1};
    for(int i = 0; i < 6; i++)
                int xx = t.x + dx[i], yy = t.y +dy[i], zz = t.z + dz[i];
    

    顺利(AC)
    第一次做三维(BFS),觉得挺典型的 记录一下~

    代码

    #include <iostream>
    #include <cstring>
    #include <queue>
    using namespace std;
    
    const int N = 35;
    int l, r, c, bx, by, bz, ex, ey, ez; //l是一共几层 r是每层几行 c是每行几个
    int dist[N][N][N];
    int mp[N][N][N];
    int dx[6] = {-1, 0, 1, 0, 0, 0}, dy[6] = {0, 1, 0, -1, 0, 0}, dz[6] = {0, 0, 0, 0, -1, 1};
    
    struct node
    {
        int x, y, z;
    };
    
    void bfs(int sx, int sy, int sz)
    {
        memset(dist, -1, sizeof dist);
        queue<node> q;
        node start;
        start.x = sx, start.y = sy, start.z = sz;
        q.push(start);
        dist[sx][sy][sz] = 0;
    
        while(q.size())
        {
            auto t = q.front();
            q.pop();
    
            for(int i = 0; i < 6; i++)
            {
                int xx = t.x + dx[i], yy = t.y +dy[i], zz = t.z + dz[i];
                if(zz >= 1 && zz <= l && xx >= 1 && xx <= r && yy >= 1 && yy <= c && dist[xx][yy][zz] == -1 && mp[xx][yy][zz] != -1)
                {
                    dist[xx][yy][zz] = dist[t.x][t.y][t.z] + 1;
                    node p;
                    p.x = xx, p.y = yy, p.z = zz;
                    q.push(p);
                }
                if(mp[xx][yy][zz] == 'E') return;
            }
        }
    }
    
    int main()
    {
        cin >> l >> r >> c;
        for(int z = 1; z <= l; z++)
        {
            for(int x = 1; x <= r; x++)
            {
                for(int y = 1; y <= c; y++) 
                {
                    char c;
                    cin >> c;
                    if(c == 'S') //起点
                    {
                        mp[x][y][z] = 2;
                        bx = x, by = y, bz = z;
                    }
                    else if(c == '#') mp[x][y][z] = -1; //障碍
                    else if(c == '.') mp[x][y][z] = 1; //可走
                    else if(c == 'E') //终点
                    {
                        mp[x][y][z] = 3;
                        ex = x, ey = y, ez = z;
                    }   
                }
            }
        }
        
        bfs(bx, by, bz);
    
        if(dist[ex][ey][ez] == -1) cout << "Trapped!" << endl;
        else cout << "Escaped in " << dist[ex][ey][ez] << " minute(s)." << endl;
    
        return 0;
    }
    
  • 相关阅读:
    0x02 枚举、模拟、递推
    0x01 位运算
    bzoj3529: [Sdoi2014]数表
    bzoj5216: [Lydsy2017省队十连测]公路建设
    POJ1789Truck History
    最小生成树模板
    POJ1258Agri-Net
    POJ1860Currency Exchange(SPFA)
    POJ3083Children of the Candy Corn
    POJ2503Babelfish
  • 原文地址:https://www.cnblogs.com/ZhengLijie/p/13557786.html
Copyright © 2020-2023  润新知