题意
zjm被困在一个三维的空间中,现在要寻找最短路径逃生!
空间由立方体单位构成。
zjm每次向上下前后左右移动一个单位需要一分钟,且zjm不能对角线移动。
空间的四周封闭。zjm的目标是走到空间的出口。
是否存在逃出生天的可能性?如果存在,则需要多少时间?
Input
输入第一行是一个数表示空间的数量。
每个空间的描述的第一行为L,R和C(皆不超过30)。
L表示空间的高度,R和C分别表示每层空间的行与列的大小。
随后L层,每层R行,每行C个字符。
每个字符表示空间的一个单元。’#‘表示不可通过单元,’.'表示空白单元。
zjm的起始位置在’S’,出口为’E’。每层空间后都有一个空行。
L,R和C均为0时输入结束。
Output
每个空间对应一行输出。
如果可以逃生,则输出如下
Escaped in x minute(s).
x为最短脱离时间。
如果无法逃生,则输出如下
Trapped!
解
注意此题是三维的空间,即可以移动的方向增加了上下两个方向(可理解为上楼,下楼),然后就是bfs搜索了。
ac代码
#include<bits/stdc++.h>
#include<algorithm>
#include<queue>
using namespace std;
int mm[35][35][35];
int vis[35][35][35]; //标记已访问过的点
int x1,ys1,z1; //起始坐标
int x2,y2,z2; //结束坐标
//上述声明中的坐标要理解清楚,x代表层,y代表每一层的行数,z代表每一层的列数!!
int dx[6]={0,1,0,-1,0,0}; //用作方向循环
int dy[6]={1,0,-1,0,0,0};
int dz[6]={0,0,0,0,1,-1};
int l,r,c;
int cnt;
struct node
{
int x,y,z;
int step; //记录步数
};
bool flag = false;
void bfs(int x,int y,int z)
{
node tp;
tp.x=x;
tp.y=y;
tp.z=z;
tp.step=0; ///!!!要赋初值啊啊啊
memset(vis,0,sizeof(vis));
vis[x][y][z] = 1; queue<node > q;
q.push(tp);
while(!q.empty())
{
node tmp = q.front();
q.pop();
for(int i=0;i<6;i++)
{
int tp_x=0,tp_y=0,tp_z=0;
tp_x = tmp.x + dx[i];
tp_y = tmp.y + dy[i];
tp_z = tmp.z + dz[i];
if(tp_x<1||tp_x>l) continue;
if(tp_y<1||tp_y>r) continue;
if(tp_z<1||tp_z>c) continue;
if(mm[tp_x][tp_y][tp_z]==0) continue;
node next;
next.x=tp_x;
next.y=tp_y;
next.z=tp_z;
next.step = tmp.step+1;
if(tp_x==x2&&tp_y==y2&&tp_z==z2)
{
cnt = next.step;
flag=true;
return;
}
if(mm[tp_x][tp_y][tp_z]&&!vis[tp_x][tp_y][tp_z]) //该点可以访问且第一次访问
{
vis[tp_x][tp_y][tp_z] = 1; //访问过的点要给标记
q.push(next);
}
}
}
return;
}
int main()
{
while(~scanf("%d%d%d",&l,&r,&c))
{
if(l==0&&r==0&&c==0) break;
memset(mm,0,sizeof(mm));
cnt=0;
flag= false;
for(int i=1;i<=l;i++)
{
for(int j=1;j<=r;j++)
{
for(int k=1;k<=c;k++)
{
char tp;
scanf(" %c",&tp);
if(tp=='#')
{
mm[i][j][k]=0;
}
else
{
if(tp=='S')
{
x1 =i,ys1=j,z1=k;
mm[i][j][k]=0;
continue;
}
if(tp=='E')
{
x2 = i,y2=j,z2=k;
mm[i][j][k] =1;
continue;
}
mm[i][j][k]=1;
}
}
}
}
bfs(x1,ys1,z1);
if(flag)
{
printf("Escaped in %d minute(s).\n",cnt);
}
else
{
printf("Trapped!\n");
}
}
return 0;
}