poj 2251(注意入口不一定是在第一层)


#include
#include
#include
using namespace std;
#define mn 35
int l,r,c,result;
const int da[] = {1,-1,0,0,0,0},db[] = {0,0,0,1,0,-1},dc[] = {0,0,1,0,-1,0}; 
bool visit[mn][mn][mn]; 
char data[mn][mn][mn];

struct node{
    int i,p,q,deep;
    node(int a,int b,int c,int d){
        i = a;
        p = b;
        q = c;
        deep = d;
    }
};
typedef node Node;
bool bfs(int d,int e,int f,int g){
    queueqq;
    qq.push(Node(d,e,f,g));
    while(!qq.empty()){
        int i = qq.front().i;
        int p = qq.front().p;
        int q = qq.front().q;
        int deep = qq.front().deep;
        qq.pop();
        if(data[i][p][q]=='E'){
            result = deep;
            return true;
        }
        for(int j=0;j<6;j++){
            int id = i+da[j];
            int pd = p+db[j];
            int qd = q+dc[j];
            if(id<0||id>=l||pd<0||pd>=r||qd<0||qd>=c||visit[id][pd][qd]||data[id][pd][qd]=='#'){
                continue; 
            }
            visit[id][pd][qd] = true;
            qq.push(Node(id,pd,qd,deep+1));
        }
    }
    return false;
}
int main(){
    while(scanf("%d%d%d",&l,&r,&c)==3&&l){
        for(int i=0;i){
            for(int j=0;j){
                scanf("%s",data[i][j]);
            }
        }
        int si,sj,sk;
        memset(visit,false,sizeof visit);
        for(int i=0;i){
            for(int j=0;j){
                for(int k=0;k){
                    if(data[i][j][k]=='S'){
                        si = i;
                        sj = j;
                        sk = k;
                    }
                }
            }
        }
        visit[si][sj][sk] = true;
        result = -1;
        if(bfs(si,sj,sk,0)){
            printf("Escaped in %d minute(s).\n",result);
        }
        else{
            printf("Trapped!\n");
        }
    }
    return 0;
} 
poj