Saturday, June 3, 2017

UVa 532 - Dungeon Master

// aarifshuvo   ``CSEJU

#include <bits/stdc++.h>
#define ll long long
#define pb push_back
#define SZ(x) ((int)(x).size())
#define scl(x) scanf("%lld", &x)
#define scll(x,y) scanf("%lld %lld", &x, &y)
#define all(x) (x).begin(),(x).end()
#define mem(a,d) memset(a,d,sizeof a)
#define REP(i,n) for(int i=0;i<n;i++)
#define REV(i,n) for(int i=n-1;i>=0;i--)
#define FOR(i,a,b) for(int i=a;i<=b;i++)
#define pri(a) cout<<a<<endl
#define prii(a,b) cout<<a<<" "<<b<<endl
using namespace std;

#define inf 123456789

ll l,r,c;
string sa[33][33];
bool vis[33][33][33];
int d[33][33][33];

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

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

void BFS(point src)
{
    mem(d,0);
    mem(vis,0);

    queue<point> Q;

    point u,v;

    vis[src.x][src.y][src.z] = 1;
    d[src.x][src.y][src.z] = 0;

    Q.push(src);

    while(!Q.empty())
    {
        u = Q.front();
        Q.pop();

   //     cout << u.x << " " << u.y << " " << u.z << endl;

        REP(i,6)
        {
            v.x = u.x + dx[i];
            v.y = u.y + dy[i];
            v.z = u.z + dz[i];

            if(v.x>=0 and v.x<l  and  v.y>=0 and v.y<r  and v.z>=0 and v.z<c)
            {
                if(vis[v.x][v.y][v.z]==0 and sa[v.x][v.y][v.z]!='#')
                {
                  //  cout << " v---- "; cout << v.x << " " << v.y << " " << v.z << endl;
                    vis[v.x][v.y][v.z] = 1;
                    d[v.x][v.y][v.z] = d[u.x][u.y][u.z] + 1;
                    Q.push(v);
                }
            }
        }
    }

}

int main()
{
    ll sx,sy,sz,ex,ey,ez;

    while(scanf("%lld%lld%lld", &l, &r, &c)==3 and l+r+c)
    {
        REP(i,l)
        {
            REP(j,r) cin>>sa[i][j];
        }

        REP(i,l)
        {
            REP(j,r)
            {
                REP(k,c)
                {
                    if(sa[i][j][k]=='S') sx=i, sy=j, sz = k;
                    if(sa[i][j][k]=='E') ex=i, ey=j, ez = k;
                }
            }
        }

        point src;
        src.x = sx, src.y = sy, src.z = sz;

        BFS(src);

        if(!vis[ex][ey][ez]) printf("Trapped!\n");
        else
        {
            printf("Escaped in %d minute(s).\n",  d[ex][ey][ez]);
        }
    }

    return 0;
}

No comments:

Post a Comment