poj2251

6 篇文章 0 订阅
涉及算法:广度搜索(bfs)
题目大意:现有一个三维的牢房,该牢房有a层,每一层有b排c列房间,现给定一个起始房间和一个终点房间,问是否可以从起点房间到达终点房间,如果可以,最少需要多少时间?
注意:每一分钟移动一步,可以往上下左右前后6个方向移动
题目分析:用一个三维数组表示地牢,值为1表示不能通行,为0表示可以通行,bfs直接搜索终点
代码如下:
package com.solo.bfs;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.LinkedList;
import java.util.Queue;

public class Main_2251 {

	static int END=2;
	
	static int a,b,c;//地牢的层、行、列
	static int[][][] maze;//maze[i][j][k]=0:地牢的第i层j行k列是空的可以通行,=1表示不可以通行
	static int startX,startY,startZ;//起始位置
	static int mStep;
	static int[][] d={{-1,0,0},{1,0,0},{0,-1,0},{0,1,0},{0,0,-1},{0,0,1}};
	static int[][][] vis;
	static Queue<P> q;
	static P head;
	
	public static void main(String[] args) throws IOException 
	{
		BufferedReader in=new BufferedReader(new InputStreamReader(System.in));
		String s;
		String[] str=new String[3];
		while(!(s=in.readLine()).equals("0 0 0"))
		{
			mStep=100000;
			q=new LinkedList<P>();
			str=s.split(" ");
			a=Integer.valueOf(str[0]);
			b=Integer.valueOf(str[1]);
			c=Integer.valueOf(str[2]);
			maze=new int[a][b][c];
			vis=new int[a][b][c];
			for(int i=0;i<a;i++)
			{
				for(int j=0;j<b;j++)
				{
					s=in.readLine();
					for(int k=0;k<c;k++)
					{
						if(s.charAt(k)=='#') maze[i][j][k]=1;
						else if (s.charAt(k)=='.') maze[i][j][k]=0;
						else if(s.charAt(k)=='S'){maze[i][j][k]=0;startX=i;startY=j;startZ=k;}	
						else if(s.charAt(k)=='E'){maze[i][j][k]=END;}
					}
				}
				s=in.readLine();
			}
			bfs();
			if(mStep==100000)
			{
				System.out.println("Trapped!");
			}
			else 
			{
				System.out.println("Escaped in "+mStep+" minute(s).");
			}
			
		}
	}
	
	static class P//地牢房间的位置信息和走到该房间需要的时间
	{
		int x,y,z,step;
		P(int x,int y,int z,int step)
		{
			this.x=x;this.y=y;this.z=z;this.step=step;
		}
	}

	static void bfs()
	{
		int cx=0,cy=0,cz=0;
		int x=0,y=0,z=0;
		q.offer(new P(startX,startY,startZ,1));
		vis[startX][startY][startX]=1;	
		while(!q.isEmpty())
		{
			head=q.poll();
			x=head.x;y=head.y;z=head.z;			
			for(int i=0;i<6;i++)
			{
				cx=x+d[i][0];cy=y+d[i][1];cz=z+d[i][2];
				if(cx>=0 && cx<a && cy>=0 && cy<b && cz>=0 && cz<c)
				{
					if(vis[cx][cy][cz]==0 && maze[cx][cy][cz]!=1)
					{
						q.offer(new P(cx,cy,cz,head.step+1));
						vis[cx][cy][cz]=1;
						if(maze[cx][cy][cz]==END)
						{
							mStep=head.step;
							return;
						}
					}
				}
			}
		}
	}
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值