zoukankan      html  css  js  c++  java
  • POJ2251 Dungeon Master

    题目:

    你被困在一个3D地牢中且继续寻找最短路径逃生!地牢由立方体单位构成,立方体单位中有的会充满岩石。向上下前后左右移动一个单位需要一分钟。你不能向对角线的四个方向移动且迷宫四周环绕着许多岩石。 

    是否可以逃出地牢?如果可以,则需要多少时间? 

    输入:

    输入的第一行包含一个数,表示地牢的数量。

    每个地牢的描述,其第一行包含三个数L,R和C(均小于等于30)。

    L表示地牢的层数;R和C分别表示每层地牢的行与列的大小。
    随后输入地牢的层数L,每层中包含R行,每行中包含C个字符。
    每个字符表示地牢的一个单元。'#'表示岩石单元,'.'表示空白单元。你的起始位置在点'S',出口为'E'。
    每层地牢的输入后都有一个空行。当L,R和C均为0时,输入结束。

    输出:

    每个迷宫对应一行输出。

      如果可以逃生,则输出如下
    Escaped in x minute(s).
      x为最短脱离时间。

      如果无法逃生,则输出如下
    Trapped!

    样例:

    分析:BFS模板题,只不过二维变成三维,注意把出口视为可通过

    ac代码如下:

    #include<iostream>
    #include<sstream>
    #include<cstdio>
    #include<string>
    #include<cstring>
    #include<algorithm>
    #include<functional>
    #include<iomanip>
    #include<numeric>
    #include<cmath>
    #include<queue>
    #include<vector>
    #include<set>
    #include<cctype>
    #define PI acos(-1.0)
    const int INF = 0x3f3f3f;
    const int NINF = -INF - 1;
    typedef long long ll;
    using namespace std;
    int L, R, C;
    struct Maze
    {
        int x, y, z;
    }m;
    char maze[35][35][35];
    int d[35][35][35];
    int sx, sy, sz, ex, ey, ez;
    int dx[6] = {1, -1, 0, 0, 0, 0}, dy[6] = {0, 0, 1, -1, 0, 0}, dz[6] = {0, 0, 0, 0, 1, -1};
    int bfs()
    {
        queue <Maze> q;
        for (int i = 0; i < L; ++i)
        {
            for (int j = 0; j < R; ++j)
            {
                for (int k = 0; k < C; ++k)
                    d[i][j][k] = INF;
            }
        }
        d[sx][sy][sz] = 0;
        m.x = sx, m.y = sy, m.z = sz;
        q.push(m);
        while (q.size())
        {
            Maze temp = q.front();
            q.pop();
            if (temp.x == ex && temp.y == ey && temp.z == ez) break;
            for (int i = 0; i < 6; ++i)
            {
                int nx = temp.x + dx[i], ny = temp.y + dy[i], nz = temp.z + dz[i];
                if ((nx >= 0 && nx < L) && (ny >= 0 && ny < R) && (nz >= 0 && nz < C) && d[nx][ny][nz] == INF && maze[nx][ny][nz] != '#')
                {
                    Maze ans;
                    ans.x = nx, ans.y = ny, ans.z = nz;
                    q.push(ans);
                    d[nx][ny][nz] = d[temp.x][temp.y][temp.z] + 1;
                }
            }
        }
        return d[ex][ey][ez];
    }
    int main()
    {
        while (cin >> L >> R >> C)
        {
            if (L == 0 && R == 0 && C == 0) break;
            for (int i = 0; i < L; ++i)
            {
                for (int j = 0; j < R; ++j)
                {
                    for (int k = 0; k < C; ++k)
                    {
                        cin >> maze[i][j][k];
                        if (maze[i][j][k] == 'S')
                            sx = i, sy = j, sz = k;
                        if (maze[i][j][k] == 'E')
                            ex = i, ey = j, ez = k;
                    }
                }
                getchar();
            }
            int num = bfs();
            if (num != INF)
                cout << "Escaped in " << num << " minute(s)." << endl;
            else
                cout << "Trapped!" << endl;
        }
        return 0;
    }
    

      

    常常因身处温室而不自知,因而懈怠; 及时当勉励,岁月不待人!
  • 相关阅读:
    OpenCV中OpenMP的使用
    四种简单的图像显著性区域特征提取方法-----AC/HC/LC/FT。
    【编程练习】寻找和为定值的多个数
    【编程练习】正整数分解为几个连续自然数之和
    (视频)《快速创建网站》2.1 在Azure上创建网站及网站运行机制
    OpenCV轮廓检测,计算物体旋转角度
    OpenCV 实现哈哈镜效果
    CUDA Cuts: Fast Graph Cuts on the GPU
    Graph Cut and Its Application in Computer Vision
    OpenCV进行图像相似度对比的几种办法
  • 原文地址:https://www.cnblogs.com/veasky/p/10970914.html
Copyright © 2011-2022 走看看