반응형
12-24 20:16
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
관리 메뉴

개발하는 고라니

[백준] 5427번 : 불 본문

Programming/백준

[백준] 5427번 : 불

조용한고라니 2021. 2. 17. 01:48
반응형
 

5427번: 불

상근이는 빈 공간과 벽으로 이루어진 건물에 갇혀있다. 건물의 일부에는 불이 났고, 상근이는 출구를 향해 뛰고 있다. 매 초마다, 불은 동서남북 방향으로 인접한 빈 공간으로 퍼져나간다. 벽에

www.acmicpc.net


[BFS]

2개의 BFS를 이용해야한다. 불을 퍼트리는 fireBFS와 상근이를 한 칸씩 이동시키는 BFS(). fireBFS는 visit에 영향을 주지도, 받지도 않는 단순히 map[][]을 변형시키는 용도이다. 반면 BFS()는 visit에 밀접한 연관이 있으며 더 이상 이동할 수 없다는 사실과 상근이가 탈출했다는 사실을 반환해야한다.

 

더 이상 이동할 수 없다는 것은 임시 큐의 size가 0일 때이다.(상근이가 이동할 수 있는 곳이 X)

반면 상근이가 탈출했다는 것은 현재 방문한 정점의 좌표 중 y가 1 또는 h이거나, x가 1 또는 w일 때 이다.

# Code </>

public class Main {

    static class Point{
        int y, x;
        public Point(int yy, int xx){
            y=yy; x=xx;
        }
    }
    static final int N = 1001;
    static int h, w, move;
    static boolean flag;
    static Queue<Point> fireQ, Q;

    static char[][] map;
    static boolean[][] visit;
    static int[] Y = {-1, 1, 0, 0}, X = {0, 0, -1, 1};


    static void fireBFS(){

        Queue<Point> tmpQ = new LinkedList<>();

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

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

                if(ny < 1 || nx < 1 || ny > h || nx > w || map[ny][nx] == '#' || map[ny][nx] == '*') continue;

                map[ny][nx] = '*';
                tmpQ.add(new Point(ny, nx));
            }
        }
        fireQ = tmpQ;
    }
    static boolean BFS(){

        Queue<Point> tmpQ = new LinkedList<>();

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

            if(p.y == 1 || p.y == h || p.x == 1 || p.x == w) flag = true;

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

                if(ny < 1 || nx < 1 || ny > h || nx > w || map[ny][nx] != '.' || visit[ny][nx]) continue;

                visit[ny][nx] = true;
                tmpQ.add(new Point(ny, nx));
            }
        }
        Q = tmpQ;

        return tmpQ.size() != 0;
    }

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

        int k = Integer.parseInt(br.readLine());

        for(int p=0; p<k; p++){
            StringTokenizer st = new StringTokenizer(br.readLine());
            w = Integer.parseInt(st.nextToken());
            h = Integer.parseInt(st.nextToken());

            visit = new boolean[N][N];
            map = new char[N][N];
            fireQ = new LinkedList<>();
            Q = new LinkedList<>();
            flag = false;
            move = 0;

            for(int i=1; i<=h; i++){
                char[] arr = br.readLine().toCharArray();
                for(int j=1; j<=w; j++){
                    map[i][j] = arr[j-1];

                    if(map[i][j] == '@'){
                        visit[i][j] = true;
                        Q.add(new Point(i, j));
                    }
                    else if(map[i][j] == '*')
                        fireQ.add(new Point(i, j));
                }
            }

            while(!flag){
                move++;
                fireBFS();
                if(!BFS()) break;
            }

            System.out.println(flag? move : "IMPOSSIBLE");
        }
    }
}
반응형

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

[백준] 1726번 : 로봇  (0) 2021.02.19
[백준] 5567번 : 결혼식  (0) 2021.02.17
[백준] 13913번 : 숨바꼭질 4  (0) 2021.02.17
[백준] 1600번 : 말이 되고픈 원숭이  (0) 2021.02.17
[백준] 11559번 : Puyo Puyo  (0) 2021.02.16
Comments