Dungeon Maste Java

Dungeon Master

OJ 链接: Dungeon Master

Description

	你被困在一个3D地下城,需要找到最快的出路!地牢是由单元立方体组成的,这些立方体可以填充也可以不填充岩石。东、西、北、南、上、下移动一个单位需要一分钟。你不能沿对角线移动,而且迷宫四周都是坚固的岩石。
有可能逃脱吗?如果可以,需要多长时间?

Input
输入由许多地下城组成。每个地下城的描述开始于一行包含三个整数L, RC(大小限制在30)L是组成地下城的关卡数量。
RC是组成每一层平面图的行数和列数。
然后是LR行块,每一行包含C个字符。每个角色描述地下城的一个牢房。充满岩石的单元格由'#'表示,空的单元格由'.'表示。“S”表示起始位置,“E”表示退出位置。每个关卡后面都有一行空白。输入端由L, RC的三个零终止。

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;
		}
	}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值