地牢大师 POJ 2251

这篇博客介绍了一个3D地牢逃脱问题,玩家需要在限定时间内找到从'S'点到'E'点的最短路径。通过使用三层循环和队列实现广度优先搜索(BFS)算法来解决此问题。文章提供了输入输出样例,并强调了在处理多组样例时队列初始化的重要性,以避免不同样例间的数据干扰。
摘要由CSDN通过智能技术生成
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();
			
		}
	}
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
POJ2251是一个经典的题目,也被称为"水仙花的谜题"。该题目要求在一个三维的迷宫中找到从起点到终点的最短路径。 在这个题目中,迷宫由一个3D的数组表示,每个位置上的值代表了该位置的状态。其中,0表示可以通过的路径,1表示墙壁,2表示起点,3表示终点。你需要编写一个程序来找到从起点到终点的最短路径,并输出路径的长度。 解决这个问题的一种常见方法是使用广度优先搜索(BFS)算法。BFS算法可以从起点开始,逐层遍历迷宫中的位置,直到找到终点或者遍历完所有可达位置。在遍历过程中,你需要记录每个位置的距离和路径信息,以便找到最短路径。 以下是解决该问题的大致思路: 1. 定义一个队列,将起点加入队列,并标记起点已访问。 2. 使用循环来遍历队列中的元素,直到队列为空。 3. 在循环中,取出队列中的元素,并获取其相邻可达位置。 4. 对于每个相邻位置,判断是否为终点,如果是则输出最短路径长度并结束程序。 5. 如果不是终点,则判断该位置是否为可通过的路径,并且未被访问过。如果满足条件,则将该位置加入队列,并更新距离和路径信息。 6. 重复步骤2-5,直到找到终点或者遍历完所有可达位置。 这只是一个简单的介绍,实际解决该问题还需要考虑一些细节,比如如何表示迷宫、如何判断位置的合法性等。你可以在编写代码时参考相关的算法和数据结构知识。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值