题意:给出a,b,c,表示一个三维的一个地牢,起始点‘S’,终点‘E’,若能成功逃出,输出最小步数,否则输出Trapped..被陷入困境,六个方向可以移动,分别是东南西北上下,‘#’表示石头,‘.’表示可以走..
分析:用队列从起点开始广搜,直到找到一条逃出路线结束
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
#include<queue>
char s[50][50][50];
int book[50][50][50];
int a,b,c,f[6][3]= {1,0,0,0,0,1,0,0,-1,-1,0,0,0,1,0,0,-1,0};
struct node {
int x,y,z,step;
};
void bfs(int x,int y,int z) {
int dx,dy,dz;
queue<node>q;
node u,v;
u.x=x,u.y=y,u.z=z,u.step=0;
book[u.x][u.y][u.z]=1;
q.push(u);
while(!q.empty()) {
u=q.front();
q.pop();
if(s[u.x][u.y][u.z]=='E') {
printf("Escaped in %d minute(s).\n",u.step);
return ;
}
for(int i=0; i<6; i++) {
dx=u.x+f[i][0],dy=u.y+f[i][1],dz=u.z+f[i][2];
if(dx<0||dy<0||dz<0||dx>=a||dy>=b||dz>=c||s[dx][dy][dz]=='#'||book[dx][dy][dz]==1)
continue;
book[dx][dy][dz]=1;
v.x=dx,v.y=dy,v.z=dz,v.step=u.step+1;
q.push(v);
}
}
printf("Trapped!\n");
}
int main() {
while(~scanf("%d %d %d",&a,&b,&c)&&(a+b+c)) {
memset(book,0,sizeof(book));
for(int i=0; i<a; i++)
for(int j=0; j<b; j++)
scanf("%s",s[i][j]);
for(int i=0; i<a; i++) {
for(int j=0; j<b; j++) {
for(int k=0; k<c; k++) {
if(s[i][j][k]=='S')
bfs(i,j,k);
}
}
}
}
return 0;
}