题目链接:http://poj.org/problem?id=2251
题意:给出一个地牢,有L层,R行C列,问在S处,能否到达E处?如果能,输出最小步数。
数据范围30,所以直接用了3维数组,模拟六种情况:上北下南左西右东天上地下。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<queue>
using namespace std;
const int INF=0x3f3f3f3f;
const int maxn=35;
int L,R,C;
int sl,sx,sy;
int el,ex,ey;
char map[maxn][maxn][maxn];
bool vis[maxn][maxn][maxn];
bool flag;
int dx[]={-1,1,0,0};
int dy[]={0,0,-1,1};
struct node{
int level,x,y;
int t;
};
bool judge_State(int level,int x,int y){
if(level<0||level>=L||x<0||x>=R||y<0||y>=C) return false;
if(map[level][x][y]=='#') return false;
if(vis[level][x][y]) return false;
return true;
}
void Bfs(){
memset(vis,0,sizeof(vis));
queue<node>q;
node s,tmp;
s.level=sl,s.x=sx,s.y=sy,s.t=0;
vis[s.level][s.x][s.y]=1;
q.push(s);
while(!q.empty()){
s=q.front();
q.pop();
if(s.level==el&&s.x==ex&&s.y==ey){
printf("Escaped in %d minute(s).\n",s.t);
flag=true;
return ;
}
for(int i=0;i<4;i++){
tmp.level=s.level;
tmp.x=s.x+dx[i];
tmp.y=s.y+dy[i];
tmp.t=s.t+1;
if(judge_State(tmp.level,tmp.x,tmp.y)){
vis[tmp.level][tmp.x][tmp.y]=1;
q.push(tmp);
}
}
tmp.level=s.level-1;
tmp.x=s.x;
tmp.y=s.y;
tmp.t=s.t+1;
if(judge_State(tmp.level,tmp.x,tmp.y)){
vis[tmp.level][tmp.x][tmp.y]=1;
q.push(tmp);
}
tmp.level=s.level+1;
tmp.x=s.x;
tmp.y=s.y;
tmp.t=s.t+1;
if(judge_State(tmp.level,tmp.x,tmp.y)){
vis[tmp.level][tmp.x][tmp.y]=1;
q.push(tmp);
}
}
flag=false;
}
int main(){
#ifndef ONLINE_JUDGE
freopen("test.in","r",stdin);
freopen("test.out","w",stdout);
#endif
while(~scanf("%d%d%d",&L,&R,&C)){
if(!L&&!R&&!C) break;
for(int i=0;i<L;i++){
for(int j=0;j<R;j++){
scanf("%s",map[i][j]);
}
getchar();
}
for(int i=0;i<L;i++){
for(int j=0;j<R;j++){
for(int k=0;k<C;k++){
if(map[i][j][k]=='S'){
sl=i,sx=j,sy=k;
}
if(map[i][j][k]=='E'){
el=i,ex=j,ey=k;
}
}
}
}
Bfs();
if(!flag) puts("Trapped!");
}
return 0;
}