poj2251 Dungeon Master

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();

}
}
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值