这是一个三维立体的图形,和二维的坐标类似,只不过坐标轴是三维的,相当于墙角书架这样的形状
那么对于的移动而言也不再单单的局限于一个平面,而是在x轴上可以向z轴走,由(3,0,0)可以直接走向(3,0,4)移动四步,
也可以由y轴移动到z轴。在xoy平面内走到了点(1,1),此时前后左右的点都为岩石无法通行,而此时恰好可以向上走,走到(1,1,1)的位置
每一次坐标的位移量就变成了dx,dy,dz三个。每次选择移动的方向有六种选择的方法
那么每一次移动的坐标不仅仅只是前后左右还包括了上下。也就是可以理解为由平面转移到了立体,而这个立体的图形是由三个平面围起来的,每一次在这其中进行移动。上下指的时沿着z轴的移动
package dbfs;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.LinkedList;
import java.util.Queue;
class Tuple{
int x;
int y;
int z;
public Tuple(int x, int y, int z) {
super();
this.x = x;
this.y = y;
this.z = z;
}
}
public class 地牢大师 {
/**
* @param args
* @throws IOException
*/
static int l,r,c;
static int N=110;
static int step[][][];
static char g[][][]=new char [N][N][N];
static Tuple stTuple;
static Tuple endTuple;
static int dx[]={1,-1,0,0,0,0};
static int dy[]={0,0,1,-1,0,0};
static int dz[]={0,0,0,0,1,-1};
public static int bfs() {
step[stTuple.x][stTuple.y][stTuple.z]=0;
Queue<Tuple> queue = new LinkedList<Tuple>();
queue.offer(stTuple);
while(!queue.isEmpty()){
Tuple tuple1 = queue.poll();
for(int i=0;i<6;i++){
int x=tuple1.x+dx[i];
int y=tuple1.y+dy[i];
int z=tuple1.z+dz[i];
if(x >=0 && x<l && y>=0 && y<r && z>=0 && z<c){
if(step[x][y][z]==-1 && g[x][y][z]!='#'){
queue.offer(new Tuple(x, y, z));
step[x][y][z]=step[tuple1.x][tuple1.y][tuple1.z]+1;
}
}
}
}
int ans= step[endTuple.x][endTuple.y][endTuple.z];
return ans;
}
public static void main(String[] args) throws IOException {
// TODO Auto-generated method stub
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in));
while(true){
String lrc[]=bufferedReader.readLine().split(" ");
l=Integer.parseInt(lrc[0]);
r=Integer.parseInt(lrc[1]);
c=Integer.parseInt(lrc[2]);
if(l==0 && r==0 && c==0) break;
for(int i=0;i<l;i++){
for(int j=0;j<r;j++){
String a=bufferedReader.readLine();
for(int k=0;k<c;k++){
char tem=a.charAt(k);
if(tem=='S'){
stTuple=new Tuple(i, j, k);
}else if(tem=='E'){
endTuple=new Tuple(i, j, k);
}
g[i][j][k]=tem;
}
}
bufferedReader.readLine();
}
step=new int [N][N][N];
for(int i=0;i<l;i++){
for(int j=0;j<r;j++){
Arrays.fill(step[i][j], -1);
}
}
int res=bfs();
if(res==-1){
System.out.println("Trapped!");
}else{
System.out.println("Escaped in "+res+" minute(s).");
}
/*
for(int i=0;i<l;i++){
for(int j=0;j<r;j++){
for(int k=0;k<c;k++){
System.out.print(g[i][j][k]+" ");
}
System.out.println();
}
System.out.println();
}*/
}
}
}