poj2251
其实和普通的bfs没有太大区别,就多了上下两个方向,不过初始化数组时一定要注意哪一维对应那一层。
#include<cstdio>
#include<cstring>
#include<queue>
#include<iostream>
#include<algorithm>
#define inf 0x3f3f3f3f
using namespace std;
const int maxn=35;
int l,r,c,mins;
char g[maxn][maxn][maxn];
int dx[]={1,0,-1,0},dy[]={0,1,0,-1},du[]={1,-1};
bool vis[maxn][maxn][maxn];
struct lo{
int x,y,d,cnt;
lo(int xx,int yy,int dd,int ss):x(xx),y(yy),d(dd),cnt(ss){}
lo(){}
};
bool ok(int x,int y,int d){
if(x>=0&&x<r&&y>=0&&y<c&&d>=0&&d<l&&(g[d][x][y]=='.'||g[d][x][y]=='E')&&!vis[d][x][y])
return true;
return false;
}
void bfs(lo st){
queue<lo> q;
q.push(st);
vis[st.d][st.x][st.y]=true;
while(!q.empty()){
lo temp=q.front();
q.pop();
for(int i=0;i<4;i++){
int xx=temp.x+dx[i];
int yy=temp.y+dy[i];
int dd=temp.d;
//cout<<xx<<' '<<yy<<' '<<dd<<endl;
if(ok(xx,yy,dd)){
int cnt=temp.cnt+1;
if(g[dd][xx][yy]=='E'){
mins=min(cnt,mins);
continue;
}
vis[dd][xx][yy]=true;
q.push(lo(xx,yy,dd,cnt));
}
}
for(int i=0;i<2;i++){
int xx=temp.x;
int yy=temp.y;
int dd=temp.d+du[i];
if(ok(xx,yy,dd)){
int cnt=temp.cnt+1;
if(g[dd][xx][yy]=='E'){
mins=min(cnt,mins);
continue;
}
vis[dd][xx][yy]=true;
q.push(lo(xx,yy,dd,cnt));
}
}
}
}
int main(){
while(cin>>l){
cin>>r>>c;\
if(!r&&!c&&!l) break;
memset(g,0,sizeof(g));
memset(vis,0,sizeof(vis));
mins=inf;
lo st,ed;
for(int i=0;i<l;i++)
for(int j=0;j<r;j++)
for(int k=0;k<c;k++){///存图
cin>>g[i][j][k];
if(g[i][j][k]=='S'){
st.x=j;
st.y=k;
st.d=i;
st.cnt=0;
}
}
//cout<<"?"<<g[0][1][0]<<endl;
bfs(st);
if(mins==inf)
cout<<"Trapped!"<<endl;
else
printf("Escaped in %d minute(s).\n",mins);
}
return 0;
}