풀이
BFS를 이용하여 해결했습니다.
이때, 제 코드에서 Info 클래스의 생성자의 순서는 x, y, z이고 축의 사용은 building[z][y][x] 즉, z는 층, y는 행, x는 열로 사용했어서 주의해야 합니다.
코드
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.LinkedList;
import java.util.Queue;
import java.util.StringTokenizer;
public class Main {
public static class Info {
int x, y, z, time;
public Info(int x, int y, int z, int time) {
super();
this.x = x;
this.y = y;
this.z = z;
this.time = time;
}
}
public static int L, R, C, answer;
public static Info startInfo;
public static StringBuilder sb;
public static boolean[][][] visited;
public static char[][][] building;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = null;
sb = new StringBuilder("");
while (true) {
st = new StringTokenizer(br.readLine(), " ");
L = Integer.parseInt(st.nextToken());
R = Integer.parseInt(st.nextToken());
C = Integer.parseInt(st.nextToken());
if (L == 0 && R == 0 && C == 0) {
break;
}
visited = new boolean[L][R][C];
building = new char[L][R][C];
for (int i = 0; i < L; ++i) {
for (int j = 0; j < R; ++j) {
building[i][j] = br.readLine().toCharArray();
for (int k = 0; k < C; ++k) {
if (building[i][j][k] == 'S') {
// info의 순서가 x y z 임을 주의
startInfo = new Info(k, j, i, 0);
break;
}
}
}
br.readLine();
}
bfs();
}
System.out.println(sb);
}
public static int[] dz = {0, 0, 0, 0, -1, 1};
public static int[] dy = {-1, 1, 0, 0, 0, 0};
public static int[] dx = {0, 0, -1, 1, 0, 0};
public static void bfs() {
Queue<Info> q = new LinkedList<Info>();
q.offer(new Info(startInfo.x, startInfo.y, startInfo.z, 0));
visited[startInfo.z][startInfo.y][startInfo.x] = true;
while (!q.isEmpty()) {
Info info = q.poll();
if (building[info.z][info.y][info.x] == 'E') {
sb.append("Escaped in ").append(info.time).append(" minute(s).\n");
return;
}
for (int i = 0; i < 6; ++i) {
int nz = info.z + dz[i];
int ny = info.y + dy[i];
int nx = info.x + dx[i];
if (nz < 0 || ny < 0 || nx < 0 || nz >= L || ny >= R || nx >= C) {
continue;
}
if (!visited[nz][ny][nx] && building[nz][ny][nx] != '#') {
q.offer(new Info(nx, ny, nz, info.time + 1));
visited[nz][ny][nx] = true;
}
}
}
sb.append("Trapped!\n");
}
}
'알고리즘 > 백준' 카테고리의 다른 글
[Java] BOJ 17472번 다리 만들기 2 (0) | 2021.07.15 |
---|---|
[Java] BOJ 5582번 공통 부분 문자열 (2) | 2021.07.13 |
[Java] BOJ 2668번 숫자고르기 (0) | 2021.07.09 |
[Java] BOJ 2981번 검문 (0) | 2021.07.08 |
[Java] BOJ 1038번 감소하는 수 (0) | 2021.07.07 |