题意:这题从二维空间扩展到三维空间了,可以上下左右前后移动,每次都只能移到相邻的空位,
每次需要花费一分钟,求从起点到终点最少要多久
#表示岩石,.表示空位,S是起点,E是终点
这题只需要从6个方向bfs是行了,开始一直超时,改成dfs就wa,
之后发现每次访问后应立即标记为已访问、、、我是通过将访问的点变成#即岩石,来标记已访问的
#include<cstdio>
#include<cstring>
#include<queue>
using namespace std;
struct stu
{
int i,j,k;
};
char s[35][35][35];
int m,n,p;
int bfs(struct stu a,struct stu b)
{
int i,j,k,t[35][35][35]={0};
queue<struct stu> q;
q.push(a);
s[a.i][a.j][a.k]='#';
while(!q.empty()){
a=q.front();
q.pop();
i=a.i;
j=a.j;
k=a.k;
if(i==b.i&&j==b.j&&k==b.k) //到达终点结束
return t[i][j][k];
if(i>0&&s[i-1][j][k]!='#'){
a.i=i-1;
a.j=j;
a.k=k;
q.push(a);
t[i-1][j][k]=t[i][j][k]+1; //计算时间
s[i-1][j][k]='#'; //记得访问后要立即标记
}
if(i<m-1&&s[i+1][j][k]!='#'){
a.i=i+1;
a.j=j;
a.k=k;
q.push(a);
t[i+1][j][k]=t[i][j][k]+1;
s[i+1][j][k]='#';
}
if(j>0&&s[i][j-1][k]!='#'){
a.i=i;
a.j=j-1;
a.k=k;
q.push(a);
t[i][j-1][k]=t[i][j][k]+1;
s[i][j-1][k]='#';
}
if(j<n-1&&s[i][j+1][k]!='#'){
a.i=i;
a.j=j+1;
a.k=k;
q.push(a);
t[i][j+1][k]=t[i][j][k]+1;
s[i][j+1][k]='#';
}
if(k>0&&s[i][j][k-1]!='#'){
a.i=i;
a.j=j;
a.k=k-1;
q.push(a);
t[i][j][k-1]=t[i][j][k]+1;
s[i][j][k-1]='#';
}
if(k<p-1&&s[i][j][k+1]!='#'){
a.i=i;
a.j=j;
a.k=k+1;
q.push(a);
t[i][j][k+1]=t[i][j][k]+1;
s[i][j][k+1]='#';
}
}
return -1; //若不可能到达终点,则返回-1
}
int main()
{
int i,j,k,sum;
struct stu x,y;
while(scanf("%d%d%d",&m,&n,&p)!=EOF){
getchar();
if(m==0&&n==0&&p==0)
break;
for(i=0;i<m;i++){
for(j=0;j<n;j++){
for(k=0;k<p;k++){
scanf("%c",&s[i][j][k]);
if(s[i][j][k]=='S'){
x.i=i;
x.j=j;
x.k=k;
}
else if(s[i][j][k]=='E'){
y.i=i;
y.j=j;
y.k=k;
}
}
getchar();
}
getchar();
}
sum=bfs(x,y);
if(sum!=-1)
printf("Escaped in %d minute(s).\n",sum);
else
printf("Trapped!\n");
}
return 0;
}