Dungeon Master
OJ 链接: Dungeon Master
Description
你被困在一个3D地下城,需要找到最快的出路!地牢是由单元立方体组成的,这些立方体可以填充也可以不填充岩石。东、西、北、南、上、下移动一个单位需要一分钟。你不能沿对角线移动,而且迷宫四周都是坚固的岩石。
有可能逃脱吗?如果可以,需要多长时间?
Input
输入由许多地下城组成。每个地下城的描述开始于一行包含三个整数L, R和C(大小限制在30)。
L是组成地下城的关卡数量。
R和C是组成每一层平面图的行数和列数。
然后是L个R行块,每一行包含C个字符。每个角色描述地下城的一个牢房。充满岩石的单元格由'#'表示,空的单元格由'.'表示。“S”表示起始位置,“E”表示退出位置。每个关卡后面都有一行空白。输入端由L, R和C的三个零终止。
Output
每个迷宫生成一行输出。如果有可能到达出口,打印一行表单
在x分钟(s)内逃逸。
其中x被替换为逃逸所需的最短时间。
如果无法转义,则打印该行
被困!
Time Limit: 1000MS Memory Limit: 65536K
Total Submissions: 86362 Accepted: 30399
样例输入输出:
Sample Input
3 4 5
S....
.###.
.##..
###.#
#####
#####
##.##
##...
#####
#####
#.###
####E
1 3 3
S##
#E#
###
0 0 0
Sample Output
Escaped in 11 minute(s).
Trapped!
代码分析:
1.dfs or bfs
2.dfs 时间溢出 选择bfs
3.只是在平面的前后左右增加为上下、前后、左右
题目代码:
import java.util.ArrayDeque;
import java.util.Comparator;
import java.util.PriorityQueue;
import java.util.Queue;
import java.util.Scanner;
public class Main{
static int xstart=0;static int ystart=0;static int hstart=0;
static int xend=0;static int yend=0;static int hend=0;
// 前后 左右 上下
static int x1[]= {0,1,0,0,-1,0};
static int y1[]= {1,0,0,-1,0,0};
static int z1[]= {0,0,1,0,0,-1};
public static void main(String[] args) {
// TODO 自动生成的方法存根
Scanner sc=new Scanner(System.in);
while(sc.hasNext())
{
int l=sc.nextInt();//lever层数 h
int r=sc.nextInt();//行 x
int c=sc.nextInt();//列 y
if(l==0&&r==0&&c==0)break;
char map[][][]=new char[l][r][c];
//数组接收
for(int i=0;i<l;i++)
{
for(int j=0;j<r;j++)
{
map[i][j]=sc.next().toCharArray();
}
}
//确定起始位置
for(int i=0;i<l;i++)
{
for(int j=0;j<r;j++)
{
for(int k=0;k<c;k++)
{
if(map[i][j][k]=='S')
{
xstart=j;ystart=k;hstart=i;
}
}
}
}
//判断是否已经走过
boolean jud[][][]=new boolean[l][r][c];
Queue<node>q1=new ArrayDeque<node>();
q1.add(new node(xstart, ystart, hstart,0));
boolean b=false;int x,y,z=0;
jud[hstart][xstart][ystart]=true;
while(!q1.isEmpty())
{
node point=q1.poll();
x=point.x;y=point.y; z=point.h;
for(int i=0;i<6;i++)
{
if(x+x1[i]<r&&x+x1[i]>=0&&y+y1[i]>=0&&y+y1[i]<c&&z+z1[i]>=0&&z+z1[i]<l)//没有越界
{
if(map[z+z1[i]][x+x1[i]][y+y1[i]]=='.'&&!jud[z+z1[i]][x+x1[i]][y+y1[i]])
{
//符合条件则加入队列
q1.add(new node(x+x1[i], y+y1[i], z+z1[i], point.minitu+1));
jud[z+z1[i]][x+x1[i]][y+y1[i]]=true;
}
else if(map[z+z1[i]][x+x1[i]][y+y1[i]]=='E')
{
System.out.println("Escaped in "+(point.minitu+1)+" minute(s).");
b=true;
break;
}
}
}
if(b)break;
}
if(!b)
{
System.out.println("Trapped!");
}
}
}
static Comparator<node>com=new Comparator<node>() {
public int compare(node o1, node o2) {
// TODO 自动生成的方法存根
return (int)(o1.minitu-o2.minitu);
}
};
}
class node
{
int x;int y;int h;
int minitu;
public node(int x,int y,int h, int minitu)
{
this.x=x;this.y=y;this.h=h;this.minitu=minitu;
}
}