알고리즘/백준

6593_상범 빌딩

베리영young 2024. 5. 27. 06:01

사용 알고리즘: bfs

사용 언어: java

 

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayDeque;
import java.util.Queue;
import java.util.Scanner;
import java.util.StringTokenizer;

public class Main_bj_6593_상범빌딩 {
    static int[] dl = {0,0,0,0,1,-1};
    static int[] dr = {-1,1,0,0,0,0};
    static int[] dc = {0,0,-1,1,0,0};

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String string = "";

        while (true) {
            StringTokenizer 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) break;

            int[] s = new int[] {0,0,0};
            int[] e = new int[] {0,0,0};

            char[][][] building = new char[l][r][c];

            for (int i = 0; i < l; i++) {
                for (int j = 0; j < r; j++) {
                    string = br.readLine();
                    for (int k = 0; k < c; k++) {
                        building[i][j][k] = string.charAt(k);
                        if (building[i][j][k]=='S') {
                            s = new int[]{i, j, k};
                        }
                        if (building[i][j][k]=='E') {
                            e = new int[]{i, j, k};
                        }
                    }
                }
                br.readLine(); //허
            }

            int moves = escapeBuilding(building, s, e, l,r,c);
            if(moves > -1) {
                System.out.println("Escaped in "+ moves +" minute(s).");
            }
            else {
                System.out.println("Trapped!");
            }
        }

    }

    private static int escapeBuilding(char[][][] building, int[] s, int[] e,
                                          int l, int r, int c) {
        int moves = -1;
        boolean[][][] visited = new boolean[l][r][c];
        visited[s[0]][s[1]][s[2]] = true;
        Queue<int[]> q = new ArrayDeque<>();
        q.add(new int[] {s[0], s[1], s[2], 0});

        while (!q.isEmpty()) {
            int[] p = q.poll();

            if (p[0] == e[0] && p[1] == e[1] && p[2] == e[2]) {
                return p[3];
            }

            for (int d = 0; d < 6; d++) {
                int nl = p[0] + dl[d];
                int nr = p[1] + dr[d];
                int nc = p[2] + dc[d];

                if(nl>=0 && nl < l &&
                        nr>=0 && nr < r && nc>=0 && nc <c) {
                    if(!visited[nl][nr][nc] && building[nl][nr][nc] != '#') {
                        visited[nl][nr][nc] = true;
                        q.add(new int[] {nl, nr, nc, p[3]+1});
                    }
                }
                //
            }
        }
        return moves;
    }
}

 

화나는 포인트:

논리가 틀리고 뭐고 하기 전에, 자꾸 말도 안 되는 런타임 에러가 뜨길래 뭔가 싶었다.

인풋이 이런 식이었다.

S....
.###.
.##..
###.#

#####
#####
##.##
##...

#####
#####
#.###
####E

 

보다 싶이, 층 마다 한 줄씩 띄어야 한다... 저거 고치니까 바로 맞았다!