POJ2251-Dungeon Master

題目鏈接:點擊打開鏈接

這道題竟然在dfs裏,不太懂。不過用bfs做就是水題了,只不過4個方向變成了6個方向。

//768K	16MS
//C++	1610B
#include <cstdio>
#include <cstring>
int n,m,sum,l;
int p1[6][3]={{0,-1,0},{0,0,1},{0,1,0},{0,0,-1},{1,0,0},{-1,0,0}};
char map[33][33][33];
int vis[33][33][33];
struct node
{
    int x,y,l,dis;
}q[36000];
int bfs(int x,int y,int k)
{
    int in=0,out=0;
    vis[l][x][y]=1;
    q[in].x=x;
    q[in].y=y;
    q[in].dis=0;
    q[in++].l=k;
    while(in>out)
    {
        int x1=q[out].x;
        int y1=q[out].y;
        int l1=q[out].l;
        int dis=q[out++].dis;
        if(map[l1][x1][y1]=='E')
            return dis;
        for(int i=0;i<6;i++)
        {
            int sx=x1+p1[i][1];
            int sy=y1+p1[i][2];
            int sl=l1+p1[i][0];
            if(sx>=0&&sx<n&&sy>=0&&sy<m&&sl>=0&&sl<l&&!vis[sl][sx][sy]&&map[sl][sx][sy]!='#')
            {
                vis[sl][sx][sy]=1;
                q[in].x=sx;
                q[in].y=sy;
                q[in].l=sl;
                q[in++].dis=dis+1;
            }

        }

    }
    return 0;
}
int main()
{
    int i,j,k,x1,y1,l1;
    while(~scanf("%d%d%d",&l,&n,&m)&&(n||m||l))
    {
        sum=0;
        memset(vis,0,sizeof(vis));
        for(k=0;k<l;k++)
        {
            for(i=0;i<n;i++)
            {
                scanf("%s",map[k][i]);
                for(j=0;j<m;j++)
                {
                    if(map[k][i][j]=='S')
                    x1=i,y1=j,l1=k;
                }
            }
            getchar();
        }
        int z=bfs(x1,y1,l1);
        if(z)
            printf("Escaped in %d minute(s).\n",z);
        else
            printf("Trapped!\n");

    }
    return 0;
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章