题目链接:http://poj.org/problem?id=2251
题意: 从S走到E,若走通,输出Escaped in X minute(s).若走不出,输出"Trapped!"
方法:简单BFS;
#include<cstdio>
#include<iostream>
#include<cstring>
#include<queue>
using namespace std;
char dun[40][40][40];
bool vis[40][40][40];
int L,R,C,fx[6][3]={{0,0,1},{0,0,-1},{0,1,0},{0,-1,0},{1,0,0},{-1,0,0}};
struct node
{
int l,r,c,tim;
}ic,tmp,s,e;
void bfs()
{
memset(vis,0,sizeof(vis));
queue<node>q;
q.push(s);
vis[s.l][s.r][s.c]=1;
while(!q.empty())
{
ic=q.front();
q.pop();
if(ic.l==e.l&&ic.r==e.r&&ic.c==e.c)
{
e.tim=ic.tim;
return ;
}
for(int i=0;i<6;++i)
{
int l,r,c;
l=ic.l+fx[i][0];
r=ic.r+fx[i][1];
c=ic.c+fx[i][2];
if(l<0||r<0||c<0||l>=L||r>=R||c>=C)
continue;
if(vis[l][r][c]||dun[l][r][c]=='#')
continue;
vis[l][r][c]=1;
tmp.l=l;
tmp.r=r;
tmp.c=c;
tmp.tim=ic.tim+1;
q.push(tmp);
}
}
}
int main()
{
while(scanf("%d%d%d",&L,&R,&C)&&(L||R||C))
{
for(int i=0;i<L;++i)
for(int j=0;j<R;++j)
for(int k=0;k<C;++k)
{
cin>>dun[i][j][k];
if(dun[i][j][k]=='S')
{
s.l=i;
s.r=j;
s.c=k;
s.tim=0;
}
if(dun[i][j][k]=='E')
{
e.l=i;
e.r=j;
e.c=k;
e.tim=0;
}
}
bfs();
if(!e.tim)
cout<<"Trapped!"<<endl;
else
cout<<"Escaped in "<<e.tim<<" minute(s)."<<endl;
}
}