import java.io.*;
import java.util.*;
public class Sangbum_building_6593 {
static int[] dz = {1, -1, 0, 0, 0, 0};
static int[] dy = {0, 0, 1, -1, 0, 0};
static int[] dx = {0, 0, 0, 0, 1, -1};
static int l, r, c;
static char[][][] building;
static int[][][] visited;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
while (true) {
StringTokenizer 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;
}
building = new char[l][r][c];
visited = new int[l][r][c];
for (int z = 0; z < l; z++){
for (int y = 0; y < r; y++ ) {
building[z][y] = br.readLine().toCharArray();
Arrays.fill(visited[z][y], 0);
}
br.readLine();
}
for (int z = 0; z < l; z++){
for (int y = 0; y < r; y++){
for (int x = 0; x < c; x++){
if (building[z][y][x] == 'S') {
bfs(z, y, x);
}
}
}
}
}
}
public static void bfs(int z, int y, int x) {
Queue<int[]> queue = new LinkedList<>();
queue.offer(new int[]{z, y, x});
visited[z][y][x] = 1;
while (!queue.isEmpty()) {
int[] cur = queue.poll();
z = cur[0];
y = cur[1];
x = cur[2];
for (int i = 0; i < 6; i++){
int nz = z + dz[i];
int ny = y + dy[i];
int nx = x + dx[i];
if (0<=nz && nz<l && 0<=ny && ny<r && 0<=nx && nx<c) {
if (building[nz][ny][nx] == 'E'){
System.out.println("Escaped in "+ visited[z][y][x] + " minute(s).");
return;
}
if (building[nz][ny][nx] == '.' && visited[nz][ny][nx] == 0){
visited[nz][ny][nx] = visited[z][y][x] + 1;
queue.offer(new int[]{nz, ny, nx});
}
}
}
}
System.out.println("Trapped!");
}
}
이 Java 코드는 특정 건물의 내부를 탐색하는 문제를 해결하기 위한 것입니다. 그러면서 3차원 공간에서의 너비 우선 탐색(BFS, Breadth-First Search) 알고리즘을 사용하고 있습니다.
본 코드의 주요 구성요소를 좀 더 자세히 살펴보겠습니다:
dz, dy, dx: 이는 3차원 좌표계를 이동하기 위한 방향 벡터들입니다. 각각의 배열은 z(높이), y(세로), x(가로)축에 따른 이동 값을 가집니다. dz를 통해 위아래로, dy를 통해 앞뒤로, dx를 통해 좌우로 이동 가능합니다.
l, r, c: 이는 건물의 크기를 의미합니다. l은 층 수, r과 c는 각 층의 행과 열의 수를 나타냅니다.
building과 visited: building은 건물의 각 위치에 대한 정보를 저장하는 3차원 문자 배열이고, visited는 BFS에서 이미 방문한 위치인지를 체크하는데 사용하는 3차원 정수 배열입니다.
bfs: 이는 너비 우선 탐색(BFS)을 수행하는 메소드입니다. 주어진 출발점에서 시작하여, 'E'로 표시된 탈출구를 찾아갑니다. 만약 탈출구를 찾게 되면, 거기까지 도달하는데 필요했던 시간을 출력하고 종료됩니다. 만약 탐색을 다 마쳤는데도 탈출구를 찾지 못했다면 "Trapped!"를 출력하게 됩니다.
main: 사용자로부터 입력을 받아 건물의 크기와 각 위치의 정보를 설정하고, 'S'로 표시된 출발점에서 BFS를 시작합니다. l, r, c가 모두 0이 입력되면 프로그램이 종료됩니다.
이 코드를 간략하게 요약하자면, 주어진 건물의 3차원 공간에서 'S'로 표시된 출발점에서 'E'로 표시된 탈출구까지의 최단 시간을 찾는 문제를 해결하는 것입니다. 이 때 BFS 알고리즘을 사용하여 탈출 경로를 찾습니다.
from collections import deque
import sys
input = sys.stdin.readline
dz = [1, -1, 0, 0, 0, 0]
dy = [0, 0, 1, -1, 0, 0]
dx = [0, 0, 0, 0, 1, -1]
def bfs(z, y, x):
queue.append((z, y, x))
visited[z][y][x] = 1
while queue:
z, y, x = queue.popleft()
for i in range(6):
nz = z + dz[i]
ny = y + dy[i]
nx = x + dx[i]
if 0 <= nz < l and 0 <= ny < r and 0 <= nx < c:
if building[nz][ny][nx] == 'E':
print(f'Escaped in {visited[z][y][x]} minute(s).')
return
if building[nz][ny][nx] == '.' and visited[nz][ny][nx] == 0:
visited[nz][ny][nx] = visited[z][y][x] + 1
queue.append((nz, ny, nx))
print("Trapped!")
while True:
l, r, c = map(int, input().split())
if l == 0 and r == 0 and c == 0:
break
building = []
queue = deque()
visited = [[[0]*c for _ in range(r)] for __ in range(l)]
for i in range(l):
floor = [list(input()) for _ in range(r)]
building.append(floor)
input()
for z in range(l):
for y in range(r):
for x in range(c):
if building[z][y][x] == 'S':
bfs(z, y, x)
잘 읽었습니다. 좋은 정보 감사드립니다.