package bfs;
import java.util.LinkedList;
import java.util.Queue;
import java.util.Scanner;
/**问题请参考http://poj.org/problem?id=2251
* 题意:给出一三维空间的地牢,要求求出由字符'S'到字符'E'的最短路径移动方向可以是上,下,左,右,前,后,六个方向
* 每移动一次就耗费一分钟,要求输出最快的走出时间。不同L层的地图,相同RC坐标处是连通的。若不能走到,则输出“Trapped!”。
* @author rayli
* @date:2014-7-15 下午9:04:37
* @version :
*
*/
public class DungeonMaster
{
static boolean str[][][];
static int ans;
boolean vist[][][];
final int dir[][] = {{1,0,0},{-1,0,0},{0,1,0},{0,-1,0},{0,0,1},{0,0,-1}};
static int L;
static int R;
static int C;
public static class SE
{
int l;
int r;
int c;
int depth;
}
boolean judge(int i, int j, int k)
{
if(i>=0&& i<L &&j>=0 && j<R && k>=0 && k<C)
return true;
else
return false;
}
boolean BFS(SE s,SE e)
{
Queue<SE> q = new LinkedList<SE>();
vist = new boolean[40][40][40];
s.depth = 0;
q.add(s);
vist[s.l][s.r][s.c] = true;
while(!q.isEmpty())
{
SE x = q.remove();
for(int i=0; i<6; i++)
{
SE tmp = new SE();
tmp.l = x.l + dir[i][0];
tmp.r = x.r + dir[i][1];
tmp.c = x.c + dir[i][2];
tmp.depth = x.depth +1;
if(tmp.l==e.l && tmp.r==e.r && tmp.c==e.c)
{
ans = tmp.depth;
return true;
}
else if(judge(tmp.l, tmp.r, tmp.c) && str[tmp.l][tmp.r][tmp.c] && !vist[tmp.l][tmp.r][tmp.c])
{
vist[tmp.l][tmp.r][tmp.c] = true;
q.add(tmp);
}
}
}
return false;
}
public static void main(String args[])
{
Scanner cin = new Scanner(System.in);
L = cin.nextInt();
R = cin.nextInt();
C = cin.nextInt();
SE start = new SE();
SE end= new SE();
while(L!=0 && R!=0 && C!=0)
{
str = new boolean[L][R][C];
char tmp[][][] = new char[L][R][C];
for(int k=0; k<L; k++)
for(int i=0; i<R; i++)
{
tmp[k][i] = cin.next().toCharArray();
}
/**
* 初始化str数组
*/
for(int k=0; k<L; k++)
for(int i=0; i<R; i++)
for(int j=0; j<C; j++)
{
if(tmp[k][i][j] == 'S')
{
str[k][i][j] = true;
start.l = k;
start.r = i;
start.c = j;
}
else if(tmp[k][i][j] == 'E')
{
str[k][i][j] = true;
end.l = k;
end.r = i;
end.c = j;
}
else if(tmp[k][i][j] == '.')
{
str[k][i][j] = true;
}
else
str[k][i][j] = false;
}
DungeonMaster dm = new DungeonMaster();
//输出结果
if(dm.BFS(start,end))
{
System.out.println("Escaped in " + ans + " minute(s).");
}
else
{
System.out.println("Trapped!");
}
/**
* 处理下一个三维数组
*/
L = cin.nextInt();
R = cin.nextInt();
C = cin.nextInt();
}
}
}
poj2251 Dungeon Master
最新推荐文章于 2021-11-15 14:26:18 发布