[백준/Java] 6593 상범빌딩

ynco·2024년 12월 25일

백준

목록 보기
10/21

6593

간단한 3차원 BFS
토마토 문제랑 비슷함


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 {

    static int[] dr = {1, -1, 0, 0, 0, 0};
    static int[] dc = {0, 0, 1, -1, 0, 0};
    static int[] dh = {0, 0, 0, 0, 1, -1};

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st;
        while (true) {
            st = new StringTokenizer(br.readLine());

            int L = Integer.parseInt(st.nextToken());
            int R = Integer.parseInt(st.nextToken());
            int C = Integer.parseInt(st.nextToken());

            if (L == 0 && R == 0 && C == 0) {
                return;
            }

            char[][][] building = new char[L][R][C];
            boolean[][][] visited = new boolean[L][R][C];

            Queue<int[]> q = new LinkedList<>();

            for (int i = 0; i < L; i++) {

                for (int r = 0; r < R; r++) {
                    String temp = br.readLine();
                    for (int c = 0; c < C; c++) {
                        building[i][r][c] = temp.charAt(c);
                        if (building[i][r][c] == 'S') {
                            q.offer(new int[]{i, r, c, 0});
                            visited[i][r][c] = true;
                        }
                    }
                }

                br.readLine();
            }

            int ans = -1;
            while (!q.isEmpty()) {
                int[] current = q.poll();

                for (int d = 0; d < 6; d++) {
                    int nh = current[0] + dh[d];
                    int nr = current[1] + dr[d];
                    int nc = current[2] + dc[d];

                    if (nh < 0 || nh >= L || nr < 0 || nr >= R || nc < 0 || nc >= C || visited[nh][nr][nc]) continue;

                    if (building[nh][nr][nc] == 'E') {
                        ans = current[3] + 1;
                        break;
                    }

                    if (building[nh][nr][nc] == '.') {
                        q.offer(new int[]{nh, nr, nc, current[3] + 1});
                        visited[nh][nr][nc] = true;
                    }
                }

            }

            if (ans == -1) {
                System.out.println("Trapped!");
            } else {
                System.out.println("Escaped in " + ans + " minute(s).");
            }

        }
    }
}

0개의 댓글