http://poj.org/problem?id=2251
从S点到E点最近的距离,不过是三位。
三维迷宫需要六个方向,并且在坐标处理上不用复杂化。
#include <iostream>
#include <cstring>
#include <queue>
using namespace std;
const int maxn=100;
string G[maxn][maxn];
bool vis[maxn][maxn][maxn];
int h,n,m;
int dx[6]={0,0,0,0,1,-1};
int dy[6]={0,0,1,-1,0,0};
int dz[6]={1,-1,0,0,0,0};
struct Node{
int x,y,z;
int t;
};
Node Begin,End;
int BFS(){
queue <Node> q;
q.push(Begin);
while (!q.empty()){
Node Now=q.front();
q.pop();
if (Now.x==End.x&&Now.y==End.y&&Now.z==End.z){
return Now.t;
}
for (int i=0;i<6;i++){
Node Tmp;
Tmp.x=Now.x+dx[i];
Tmp.y=Now.y+dy[i];
Tmp.z=Now.z+dz[i];
Tmp.t=Now.t+1;
if (Tmp.x>=0&&Tmp.x<h&&Tmp.y>=0&&Tmp.y<n&&Tmp.z>=0&&Tmp.z<m&&!vis[Tmp.x][Tmp.y][Tmp.z]&&G[Tmp.x][Tmp.y][Tmp.z]!='#'){
vis[Tmp.x][Tmp.y][Tmp.z]=1;
q.push(Tmp);
}
}
}
return -1;
}
int main(){
while (cin >> h >> n >> m){
if (h==0&&n==0&&m==0){
return 0;
}
for (int i=0;i<h;i++){
for (int j=0;j<n;j++){
cin >> G[i][j];
for (int k=0;k<m;k++){
if (G[i][j][k]=='S'){
Begin.x=i;
Begin.y=j;
Begin.z=k;
Begin.t=0;
}
if (G[i][j][k]=='E'){
End.x=i;
End.y=j;
End.z=k;
End.t=0;
}
}
}
}
memset(vis,false,sizeof(vis));
int ans=BFS();
if (ans==-1){
cout << "Trapped!" << endl;
}
else{
cout << "Escaped in " << ans << " minute(s)." << endl;
}
}
}