POJ 2251 Dungeon Master bfs 难度:0

http://poj.org/problem?id=2251

bfs,把两维换成三维,但是30*30*30=9e3的空间时间复杂度仍然足以承受

 

#include <cstdio>

#include <cstring>

#include <algorithm>

#include <queue>

using namespace std;

struct P{

        int x,y,z;

        P(){x=y=z=0;}

        P(int x,int y,int z){

                this->x=x;this->y=y;this->z=z;

        }

};

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

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

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



int l,r,c;

char maz[30][30][31];

int step[30][30][30];

bool in(int z,int x,int y){

        return z>=0&&z<l&&

        x>=0&&x<r&&

        y>=0&&y<c;

}

int main(){

        while(scanf("%d%d%d",&l,&r,&c)==3&&l){

                memset(step,0x7f,sizeof(step));

                for(int i=0;i<l;i++){

                        for(int j=0;j<r;j++){

                                scanf("%s",maz[i][j]);

                        }

                }

                queue<P> que;

                for(int i=0;i<l;i++){

                        for(int j=0;j<r;j++){

                                for(int k=0;k<c;k++){

                                        if(maz[i][j][k]=='E'){

                                                que.push(P(j,k,i));

                                                step[i][j][k]=0;

                                        }

                                }

                        }

                }

                bool fl=false;

                while(!que.empty()){

                        P f=que.front();que.pop();

                        int z=f.z,x=f.x,y=f.y;

                        if(maz[z][x][y]=='S'){

                                fl=true;

                                printf("Escaped in %d minute(s).\n",step[z][x][y]);

                                break;

                        }

                        for(int i=0;i<6;i++){

                                int tx=x+dx[i],ty=y+dy[i],tz=z+dz[i];

                                if(in(tz,tx,ty)&&maz[tz][tx][ty]!='#'&&step[tz][tx][ty]>step[z][x][y]+1){

                                        step[tz][tx][ty]=step[z][x][y]+1;

                                        que.push(P(tx,ty,tz));

                                }

                        }

                }

                while(!que.empty())que.pop();

                if(!fl)puts("Trapped!");

        }

        return 0;

}

  

你可能感兴趣的:(master)