您的位置:首页 > 其它

poj2251

2015-09-18 15:57 239 查看
设计算法:广度搜索

题目大意:给定一个a层,b行,c列的三维地牢,并给定了一个起点和终点,要求以最短的时间从起点走到终点,“.”表示可走区域t,“#”表示不能通过区域

题目分析:明显的广度搜索

代码如下:

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

public class Main
{
	static int a,b,c;
	static int maze[][][]=new int[60][60][60];
	static P start;
	static int END=2;
	static Queue<P> q;
	static int[][][] vis=new int[60][60][60];
	static int[][] d={{-1,0,0},{1,0,0},{0,-1,0},{0,1,0},{0,0,-1},{0,0,1}};
	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 fill(int [][][] arr,int b){
		for(int i=0;i<60;i++){
			for(int j=0;j<60;j++){
				for(int k=0;k<60;k++){
					arr[i][j][k]=b;
				}
			}
		}
	}
	public static void main(String[] args) throws IOException
	{
		BufferedReader in=new BufferedReader(new InputStreamReader(System.in));
		String s;
		q=new LinkedList<P>();
		String[] str=new String[3];
		while(!(s=in.readLine()).equals("0 0 0"))
		{
			q.clear();
			fill(vis, 0);
			
			str=s.split(" ");
			a=Integer.valueOf(str[0]);
			b=Integer.valueOf(str[1]);
			c=Integer.valueOf(str[2]);

			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;start=new P(i,j,k,0);
						}else if (s.charAt(k)=='E') 
						{
							maze[i][j][k]=END;
						}
					}
				}
				s=in.readLine();
			}
			int mStep=dfs();
			if(mStep==-1)
			{
				System.out.println("Trapped!");
			}else 
			{
				System.out.println("Escaped in "+mStep+" minute(s).");
			}
		}

	}
	
	public static int dfs()
	{
		q.offer(start);
		vis[start.x][start.y][start.z]=1;
		P head,next;
		int x,y,z,step;
		int cx,cy,cz;
		while(!q.isEmpty())
		{
			head=q.poll();
			x=head.x;y=head.y;z=head.z;step=head.step;
			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,step+1));
						vis[cx][cy][cz]=1;
						if(maze[cx][cy][cz]==END)
						{
							return step+1;
						}
					}
				}
			}
		}
		return -1;
	}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: