Monday, April 25, 2011

532 - Dungeon Master

#include<iostream>
#include<cstdio>
#include<queue>
#include<cstring>
#define M 31
using namespace std;

char DUNG[M][M][M],dummy[5];
int next [6][3]={{-1,0,0},{1,0,0},{0,-1,0},{0,1,0},{0,0,-1},{0,0,1}};
int L,R,C;
int BFS(int dx,int dy,int dz);
struct Node
{
    int x,y,z;
};

int main()
{
    int i,j,k,dx,dy,dz,f,time;

    //freopen("in.txt","r",stdin);

    while(scanf("%d%d%d\n",&L,&R,&C)&&(L+R+C))
    {
        f=0;
        for(i=0;i<L;i++)
        {
            for(j=0;j<R;j++)
            {
                gets(DUNG[i][j]);
                if(!f)
                    for(k=0;DUNG[i][j][k];k++)
                    {
                        if(DUNG[i][j][k]=='S')
                        {
                            f=1;
                            dx=i,dy=j,dz=k;
                        }
                    }
            }
            gets(dummy);
        }
        time=BFS(dx,dy,dz);

        if(time<0)
            printf("Trapped!\n");
        else
            printf("Escaped in %d minute(s).\n",time);
    }
    return 0;
}

int BFS(int dx,int dy,int dz)
{
    int i,x,y,z,tx,ty,tz;
    int d[M][M][M];
    DUNG[dx][dy][dz]='#';
    queue<Node>Q;
    Node N;

    d[dx][dy][dz]=0;
    N.x=dx;N.y=dy;N.z=dz;
    Q.push(N);

    while(!Q.empty())
    {
        N=Q.front();Q.pop();
        x=N.x;y=N.y;z=N.z;

        for(i=0;i<6;i++)
        {
            tx=x+next[i][0];
            ty=y+next[i][1];
            tz=z+next[i][2];

            if(tx>=0&&tx<L&&ty>=0&&ty<R&&tz>=0&&tz<C&&DUNG[tx][ty][tz]!='#')
            {
                d[tx][ty][tz]=d[x][y][z]+1;
                if(DUNG[tx][ty][tz]=='E')return d[tx][ty][tz];
                DUNG[tx][ty][tz]='#';
                N.x=tx;N.y=ty;N.z=tz;
                Q.push(N);
            }
        }
    }
    return -1;
}

No comments:

Post a Comment

Note: Only a member of this blog may post a comment.