POJ 2251 Dungeon Master

杭电“胜利大逃亡”英文版,三维BFS,水水的。

不过注意细节,还是要注意细节!!!

数组开大点,不要给他们省内存,开30*30*30的会RE;

下面是代码:

#include <stdio.h>
#include <string.h>
#include <queue>
using namespace std;
struct node
{
    int x,y,z,cut;
    bool operator > (const node &a) const
    {
        return cut > a.cut;
    }
}di[6]={ -1,0,0,0, 1,0,0,0, 0,-1,0,0, 0,1,0,0, 0,0,-1,0, 0,0,1,0};
int map1[35][35][35],l,r,c;
int main()
{
    while(scanf("%d%d%d",&l,&r,&c),l||r||c)
    {
        char s[40];
        memset(map1,0,sizeof(map1));
        priority_queue <struct node ,vector <struct node>,greater<struct node> >q;
        struct node du,dc;
        int i,j,k,flat;
        for(i=1; i<=l; i++)
        {
            for(j=1; j<=r; j++)
            {
                scanf("%s",s);
                for(k=1; k<=c; k++)
                {
                    if(s[k-1]=='.')
                    {
                        map1[i][j][k]=1;
                    }
                    else if(s[k-1]=='E')
                    {
                        map1[i][j][k]=2;
                    }
                    else if(s[k-1]=='S')
                    {
                        du.x=i;
                        du.y=j;
                        du.z=k;
                        du.cut=0;
                        q.push(du);
                    }
                }
            }
        }
        flat=0;
        while(!q.empty())
        {
            du=q.top();
            q.pop();
            for(i=0;i<6;i++)
            {
                if(map1[du.x+di[i].x][du.y+di[i].y][du.z+di[i].z]==1)
                {
                    dc.x=du.x+di[i].x;
                    dc.y=du.y+di[i].y;
                    dc.z=du.z+di[i].z;
                    dc.cut=du.cut+1;
                    map1[du.x+di[i].x][du.y+di[i].y][du.z+di[i].z]=0;
                    q.push(dc);
                }
                else if(map1[du.x+di[i].x][du.y+di[i].y][du.z+di[i].z]==2)
                {
                    dc.x=du.x;
                    dc.y=du.y;
                    dc.z=du.z;
                    dc.cut=du.cut;
                    flat=1;
                    break;
                }
            }
            if(flat)
            {
                break;
            }
        }
        if(flat)
        {
            printf("Escaped in %d minute(s).\n",dc.cut+1);
        }
        else
        {
            printf("Trapped!\n");
        }
    }
    return 0;
}


posted @ 2013-08-19 20:19  、小呆  阅读(130)  评论(0编辑  收藏  举报