본문 바로가기

[Algorithms]/[Problems]

BOJ. 6593번. 상범빌딩

728x90

 

이제 DFS,BFS에 대한 간단한 문제들은 자리를 잡은 느낌이다. 이번 문제도 간단한 BFS문제였고, 2차원 배열에서 돌아가는 일반 문제와 달리 3차원 공간이라 재미있었다. 하지만 결국은 축이 하나 더 들어간 노가다;;

그리고 출력하는 문자가 틀릴 경우 바로 틀렸다고 안뜨고, 33%쯤에서 뜬다;;; 조심하자!

www.acmicpc.net/problem/6593

 

6593번: 상범 빌딩

당신은 상범 빌딩에 갇히고 말았다. 여기서 탈출하는 가장 빠른 길은 무엇일까? 상범 빌딩은 각 변의 길이가 1인 정육면체(단위 정육면체)로 이루어져있다. 각 정육면체는 금으로 이루어져 있어

www.acmicpc.net

package week5;

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

public class Day3_BOJ6593 {

	static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
	
	static char map[][][];
	static boolean c[][][];
	static Pos start;
	static Queue<Pos> q = new LinkedList<Pos>();
	static int dh[] = {0,0,0,0,1,-1};
	static int dy[] = {1,-1,0,0,0,0};
	static int dx[] = {0,0,-1,1,0,0};
	static int L,R,C,time;
	
	static class Pos{
		int x,y,h,time;

		public Pos(int h, int y, int x, int time) {
			this.x = x;
			this.y = y;
			this.h = h;
			this.time = time;
		}

		@Override
		public String toString() {
			return "Pos [x=" + x + ", y=" + y + ", h=" + h + "]";
		}	
		
	}
	
	private static void bfs() {
		q.add(start);
		c[start.h][start.y][start.x] = true;
		
		while(!q.isEmpty()) {
			Pos cur = q.poll();
			int oh = cur.h;
			int oy = cur.y;
			int ox = cur.x;
			int ot = cur.time;
			for(int d=0; d<6; d++) {
				int nh = oh+dh[d];
				int ny = oy+dy[d];
				int nx = ox+dx[d];
				if(nh>=0 && nh<L && ny>=0 && ny<R && nx>=0 && nx<C && !c[nh][ny][nx] && map[nh][ny][nx]!='#') {
					if(map[nh][ny][nx]=='E') {
						time = Math.min(time, ot+1);
					}
					if(map[nh][ny][nx]=='.') {
						c[nh][ny][nx]=true;
						q.offer(new Pos(nh,ny,nx,ot+1));
					}
				}
			}
		}
		
	}
	
	public static void main(String[] args) throws IOException {
		
		while(true) {
			time=Integer.MAX_VALUE;
			q = new LinkedList<Pos>();
			String[] lrcInfo = br.readLine().split(" ");
			L = Integer.parseInt(lrcInfo[0]);
			R = Integer.parseInt(lrcInfo[1]);
			C = Integer.parseInt(lrcInfo[2]);
			if(L==0 && R==0 && C==0) {
				break;
			}
			
			map = new char[L][R][C];
			c = new boolean[L][R][C];
			
			for(int i=0; i<L; i++) {
				for(int j=0; j<R; j++) {
					String[] s = br.readLine().split("");
					for(int k=0; k<C; k++) {
						map[i][j][k] = s[k].charAt(0);
						if(map[i][j][k]=='S') {
							start = new Pos(i, j, k, 0);
						}
					}
				}
				br.readLine();
			}
			
			bfs();
			if(time<Integer.MAX_VALUE) {
				System.out.println("Escaped in "+time+ " minute(s)."); 
			}else {
				System.out.println("Trapped!");
			}
			
		}
		
		
	}

}
728x90