这道题的意思是有让你从S点到E点,求出最短距离,当时这个最短距离是在三维情况下搜索,我们用了一个上下左右,上一层,下一层这六个方向的方向数组,来进行BFS,就可以求出来了。
int dir[6][3]= {-1,0,0,1,0,0,0,-1,0,0,1,0,0,0,-1,0,0,1};
当然了,标记数组也要是三维的所以是 int vis[31][31][31];
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <queue>
using namespace std;
int vis[31][31][31];
string mp[109][109];
int dir[6][3]= {-1,0,0,1,0,0,0,-1,0,0,1,0,0,0,-1,0,0,1};
int c,l,r;
int sum;
int sd,sx,sy;
struct node
{
int d,x,y;
int cnt;
} e,s,v,u;
queue<node>Q;
void bfs()
{
s.d = sd;
s.x = sx;
s.y = sy;
//cout<<s.d<<" "<<s.x<<" "<<s.y<<" "<<s.cnt<<endl;
s.cnt = 0;
while(!Q.empty())Q.pop();
Q.push(s);
int flag = 0;
while(!Q.empty())
{
u = Q.front();
//cout<<u.d<<" "<<u.x<<" "<<u.y<<endl;
Q.pop();
for(int i = 0; i<6; i++)//三维六个方向
{
int dd = u.d + dir[i][0];
int xx = u.x + dir[i][1];
int yy = u.y + dir[i][2];
if(dd>=0&&dd<c&&xx>=0&&xx<l&&yy>=0&&yy<r&&!vis[dd][xx][yy]&&mp[dd][xx][yy]!='#')
{
vis[dd][xx][yy] = 1;
v.d = dd;
v.x = xx;
v.y = yy;
v.cnt = u.cnt + 1;
Q.push(v);
if(mp[dd][xx][yy]=='E')
{
//cout<<"TEST"<<endl;
sum=u.cnt+1;
return;
}
}
}
}
}
int main()
{
//freopen("ans.txt","r", stdin);
while(~scanf("%d%d%d",&c,&l,&r))
{
if(c==0&&l==0&&r==0)break;
for (int i = 0; i < c; ++i)
{
for (int j = 0; j < l; ++j)
{
cin>>mp[i][j];
for (int k = 0; k < mp[i][j].size(); ++k)
{
if (mp[i][j][k] == 'S')
{
sd = i;
sx = j;
sy = k;
}
}
}
}
//cout<<s.d<<" "<<s.x<<" "<<s.y<<" "<<s.cnt<<endl;
memset(vis,0,sizeof(vis));
sum = -1;
vis[s.d][s.x][s.y] = 1;
bfs();
if(sum==-1)
{
puts("Trapped!");
}
else
{
printf("Escaped in %d minute(s).\n",sum);
}
}
return 0;
}