반응형
12-24 07:02
Today
Total
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
관리 메뉴

개발하는 고라니

[백준] 6593번 : 상범 빌딩 본문

Programming/백준

[백준] 6593번 : 상범 빌딩

조용한고라니 2021. 2. 22. 14:29
반응형
 

6593번: 상범 빌딩

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

www.acmicpc.net

[BFS]

일반적인 2차원 배열에서 3차원 배열로 응용된 문제. 앞 뒤 좌 우 뿐만 아니라 상 하 까지 탐색 범위를 늘려주고 BFS를 실행하되, 탈출구를 찾았는지 못찾았는지에 대한 분기가 필요하다.

# Code </>

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 class Point{
        int z, y, x;
        public Point(int zz, int yy, int xx){
            z=zz; y=yy; x=xx;
        }
    }
    static int l, r, c;
    static char[][][] map;
    static boolean[][][] visit;
    static int[][][] move;
    static int[] Z = {-1, 1, 0, 0, 0, 0}, Y = {0, 0, -1, 1, 0, 0}, X = {0, 0, 0, 0, -1, 1};

    static boolean BFS(Point s, Point e){

        Queue<Point> Q = new LinkedList<>();
        boolean flag = false;

        visit[s.z][s.y][s.x] = true;
        Q.add(new Point(s.z, s.y, s.x));

        while(!Q.isEmpty()){
            Point p = Q.poll();

            if(p.z == e.z && p.y == e.y && p.x == e.x) flag = true;

            int cnt = move[p.z][p.y][p.x];

            for(int a=0; a<6; a++){
                int nz = p.z+Z[a];
                int ny = p.y+Y[a];
                int nx = p.x+X[a];

                if(nz < 1 || ny < 1 || nx < 1 || nz > l || ny > r || nx > c || visit[nz][ny][nx] || map[nz][ny][nx] == '#') continue;

                visit[nz][ny][nx] = true;
                move[nz][ny][nx] = cnt + 1;
                Q.add(new Point(nz, ny, nx));
            }
        }
        return flag;
    }

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

        while(true){
            Point[] p = new Point[2];
            StringTokenizer st = new StringTokenizer(br.readLine());

            l = Integer.parseInt(st.nextToken());
            r = Integer.parseInt(st.nextToken());
            c = Integer.parseInt(st.nextToken());
            if(l+r+c == 0) break;

            map = new char[31][31][31];
            visit = new boolean[31][31][31];
            move = new int[31][31][31];

            for(int i=1; i<=l; i++){
                for(int j=1; j<=r; j++){
                    char[] str = br.readLine().toCharArray();
                    for(int z=1; z<=c; z++){
                        map[i][j][z] = str[z-1];

                        if(map[i][j][z] == 'S') p[0] = new Point(i, j, z);
                        else if(map[i][j][z] == 'E') p[1] = new Point(i, j, z);
                    }
                }
                br.readLine();
            }

            if(BFS(p[0], p[1]))
                System.out.println("Escaped in " + move[p[1].z][p[1].y][p[1].x] + " minute(s).");
            else
                System.out.println("Trapped!");
        }
    }
}
반응형

'Programming > 백준' 카테고리의 다른 글

[백준] 11404번 : 플로이드  (0) 2021.02.27
[백준] 1613번 : 역사  (0) 2021.02.26
[백준] 1194번 : 달이 차오른다, 가자  (0) 2021.02.21
[백준] 4179번 : 불!  (0) 2021.02.19
[백준] 1726번 : 로봇  (0) 2021.02.19
Comments