地牢大師(3 DBFS)

18931 ワード

あなたは今3次元の牢屋に閉じ込められていて、最も速い離脱の道を見つける必要があります!
地牢はいくつかの単位立方体からなり、一部は岩石障害を含まずに直接通過することができ、一部は岩石障害を含んで通過できない.
北へ、南へ、東へ、西へ、上へまたは下へ1ユニットの距離を移動するには1分かかります.
対角線に沿って移動することはできません.迷宮の境界は硬い岩で、境界の範囲から出てはいけません.
すみません、逃げる可能性はありますか?
もしよろしければ、どのくらいかかりますか.
入力フォーマット入力には、複数のテストデータが含まれます.
各組のデータの第1行は、3つの整数L、R、Cを含み、それぞれ地獄層数、および各層地獄の行数および列数を表す.
次に、L個のR行C列の文字行列があり、各層の牢屋の具体的な状況を表す.
各文字は、1つのダンジョンユニットの具体的な状況を記述するために使用されます.
このうち、岩の壁に満ちたセルを「#」で表し、障害を含まない空のセルを用いる.表示、あなたのスタート位置は「S」で、ゴールは「E」で表示されます.
各文字マトリクスの後ろには空の行が含まれます.
動作"0 0 0 0"を入力すると、入力が終了します.
出力フォーマット各グループのデータは結果を出力し、各結果は1行を占めます.
ダンジョンから逃れることができれば、「Escaped in x minute.」を出力し、このうちXは脱出に要する最短時間である.
地牢から脱出できなければ、「トラップド!」を出力する.
データ範囲1≦L,R,C≦100入力サンプル:3 4 5 S....####.#######.####.#
##.## ##…
#.### ####E
1 3 3 S## #E#
0 0 0出力サンプル:Escaped in 11 minute(s).Trapped!
#include 
#include 
#include 
#include 

using namespace std;

const int N = 110;

struct Point
{
     
    int x, y, z;
};

int L, R, C;
char g[N][N][N];
Point q[N * N * N];
int dist[N][N][N];

int dx[6] = {
     1, -1, 0, 0, 0, 0};
int dy[6] = {
     0, 0, 1, -1, 0, 0};
int dz[6] = {
     0, 0, 0, 0, 1, -1};

int bfs(Point start, Point end)
{
     
    int hh = 0, tt = 0;
    q[0] = start;
    memset(dist, -1, sizeof dist);
    dist[start.x][start.y][start.z] = 0;

    while (hh <= tt)
    {
     
        auto t = q[hh  ];
        hh++

        for (int i = 0; i < 6; i ++ )
        {
     
            int x = t.x + dx[i], y = t.y + dy[i], z = t.z + dz[i];
            if (x < 0 || x >= L || y < 0 || y >= R || z < 0 || z >= C) continue;  //   
            if (g[x][y][z] == '#') continue;  //     
            if (dist[x][y][z] != -1) continue;  //      

            dist[x][y][z] = dist[t.x][t.y][t.z] + 1;
            if (x == end.x && y == end.y && z == end.z) return dist[x][y][z];
            tt++;
            q[tt] = {
     x, y, z};
            
        }
    }

    return -1;
}

int main()
{
     
    while (scanf("%d%d%d", &L, &R, &C), L || R || C)
    {
     
        Point start, end;
        for (int i = 0; i < L; i ++ )
            for (int j = 0; j < R; j ++ )
            {
     
                scanf("%s", g[i][j]);
                for (int k = 0; k < C; k ++ )
                {
     
                    char c = g[i][j][k];
                    if (c == 'S') start = {
     i, j, k};
                    else if (c == 'E') end = {
     i, j, k};
                }
            }

        int distance = bfs(start, end);
        if (distance == -1) puts("Trapped!");
        else printf("Escaped in %d minute(s).
"
, distance); } return 0; }