Descriptions:
你被困在一个3D地牢中且继续寻找最短路径逃生!地牢由立方体单位构成,立方体单位中有的会充满岩石。向上下前后左右移动一个单位需要一分钟。你不能向对角线的四个方向移动且迷宫四周环绕着许多岩石。
是否可以逃出地牢?如果可以,则需要多少时间?
Input
输入的第一行包含一个数,表示地牢的数量。
每个地牢的描述,其第一行包含三个数L,R和C(均小于等于30)。
L表示地牢的层数;R和C分别表示每层地牢的行与列的大小。
随后输入地牢的层数L,每层中包含R行,每行中包含C个字符。
每个字符表示地牢的一个单元。’#‘表示岩石单元,’.‘表示空白单元。你的起始位置在点’S’,出口为’E’。
每层地牢的输入后都有一个空行。当L,R和C均为0时,输入结束。
Output
每个迷宫对应一行输出。
如果可以逃生,则输出如下
Escaped in x minute(s).
x为最短脱离时间。
如果无法逃生,则输出如下
Trapped!
Sample Input
3 4 5
S....
.###.
.##..
###.#
#####
#####
##.##
##...
#####
#####
#.###
####E
1 3 3
S##
#E#
###
0 0 0
Sample Output
Escaped in 11 minute(s).
Trapped!
####### 解题思路
三维数组
bfd+队列
只要是求步数和路径长度的,都先定义一个节点(坐标和步数)
注意:在输出第一个样例之后,不用换行再输入第二个样例。更重要的一点就是在bfs中声明队列(因为题目有多个样例,防止上一个样例中的数据还保存在队列中,造成第二个样例输出错误)
java
import java.util.LinkedList;
import java.util.Queue;
import java.util.Scanner;
public class Main {
static int l,r,c;
static int sl,sr,sc,el,er,ec;
static int[] dirx = {1,-1,0,0,0,0};
static int[] diry = {0,0,1,-1,0,0};
static int[] dirz = {0,0,0,0,1,-1};
static boolean vis[][][]=new boolean[35][35][35];
static char[][][] map=new char[35][35][35];
static class Node{
int x;
int y;
int z;
int step;
}
public static void bfs() {
Queue<Node> q=new LinkedList<Node>();
Node node=new Node();
node.x=sr;
node.y=sc;
node.z=sl;
node.step=0;
q.add(node);
vis[sl][sr][sc]=true;
while(!q.isEmpty()) {
Node node1=q.poll();
if(node1.z == el && node1.x == er && node1.y == ec) {
System.out.println("Escaped in "+node1.step+" minute(s).");
return;
}
for(int i=0;i<6;i++) {
Node node2=new Node();
int xx = node1.x + dirx[i];
int yy = node1.y + diry[i];
int zz = node1.z + dirz[i];
if(juge(xx,yy,zz) && vis[zz][xx][yy]==false && map[zz][xx][yy]!='#') {
node2.x = xx;
node2.y = yy;
node2.z = zz;
node2.step=node1.step+1;
q.add(node2);
vis[zz][xx][yy]=true;
}
}
}
System.out.println("Trapped!");
}
public static boolean juge(int i,int j,int z){
return (i>=0 && i<r && j>=0 && j<c && z>=0 && z<l);
}
public static void main(String[] args) {
Scanner in=new Scanner(System.in);
while(in.hasNext()) {
l=in.nextInt(); //层数
r=in.nextInt(); //行
c=in.nextInt(); //列
in.nextLine();
if(l==0 && r==0 && c==0) {
break;
}
for(int i=0;i<l;i++) {
for(int j=0;j<r;j++) {
map[i][j]=in.next().toCharArray();
for(int k=0;k<c;k++) {
if(map[i][j][k]=='S') {
sl=i;
sr=j;
sc=k;
}
if(map[i][j][k]=='E') {
el=i;
er=j;
ec=k;
}
}
}
}
for(int i=0;i<l;i++) {
for(int j=0;j<r;j++) {
for(int k=0;k<c;k++) {
vis[i][j][k]=false;
}
}
}
bfs();
}
}
}