반응형
01-12 04:35
Today
Total
«   2025/01   »
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
관리 메뉴

개발하는 고라니

[백준] 4179번 : 불! 본문

Programming/백준

[백준] 4179번 : 불!

조용한고라니 2021. 2. 19. 23:16
반응형
 

4179번: 불!

입력의 첫째 줄에는 공백으로 구분된 두 정수 R과 C가 주어진다. 단, 1 ≤ R, C ≤ 1000 이다. R은 미로 행의 개수, C는 열의 개수이다. 다음 입력으로 R줄동안 각각의 미로 행이 주어진다.  각각의 문

www.acmicpc.net


[2개의 BFS]

 

[백준] 5427번 : 불

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

dev-gorany.tistory.com

위 문제와 매우 유사한 문제. 이번에는 map[r+2][c+2]의 배열을 만들어, 주어진 맵 테두리를 건물 밖으로 생각하고 풀었다. 이렇게 하면 좌표의 범위에 신경써야하는 부분이 줄어든다.

예)

4 4

####

#JF#

#..#

#..#

이면,

.  .  .  .  .

. # # # #.

. # J F  # .

. # .  .  # .

. # .  .  #.

.  .  . .  .  .

같은 모양이 되도록.

 

불을 퍼트리는 동작은 fireBFS()를 통하여 진행하고,

지훈이를 이동시키는 동작은 BFS()를 통하여 진행한다. BFS()는 visit[][]의 영향을 받는다.

# Code </>

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.LinkedList;
import java.util.Queue;
import java.util.StringTokenizer;

public class Main {

    static class Point{
        int y, x;
        public Point(int yy, int xx){
            y=yy; x=xx;
        }
    }
    static char[][] map = new char[1002][1002];
    static boolean[][] visit = new boolean[1002][1002];
    
    static int[] Y = {-1, 1, 0, 0}, X = {0, 0, -1, 1};
    static Queue<Point> fireQ = new LinkedList<>(), Q = new LinkedList<>();
    static int r, c;
    
    static boolean possible;

    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 > r || nx > c || map[ny][nx] == '#' || map[ny][nx] == 'F') continue;

                map[ny][nx] = 'F';
                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.x < 1 || p.y > r || p.x > c) {
                possible = true;
                break;
            }

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

                if(ny < 0 || nx < 0 || ny > r+1 || nx > c+1 || visit[ny][nx]) continue;

                if(map[ny][nx] == '.') {
                    visit[ny][nx] = true;
                    tmpQ.add(new Point(ny, nx));
                }
            }
        }

        Q = tmpQ;
        return Q.size() == 0?false:true;
    }

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

        r = Integer.parseInt(st.nextToken());
        c = Integer.parseInt(st.nextToken());

        Arrays.fill(map[0], '.');
        Arrays.fill(map[r+1], '.');
        for(int i=0; i<=r+1; i++) {
            map[i][0] = '.';
            map[i][c+1] = '.';
        }

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

                if(map[i][j] == 'J') {
                    Q.add(new Point(i, j));
                    visit[i][j] = true;
                }
                else if(map[i][j] == 'F')
                    fireQ.add(new Point(i, j));
            }
        }
        int cnt = -1;
        while(true){
            cnt++;
            fireBFS();
            
            if(!BFS()) break;
            if(possible) break;
        }
        System.out.println(possible?cnt:"IMPOSSIBLE");
    }
}
반응형

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

[백준] 6593번 : 상범 빌딩  (0) 2021.02.22
[백준] 1194번 : 달이 차오른다, 가자  (0) 2021.02.21
[백준] 1726번 : 로봇  (0) 2021.02.19
[백준] 5567번 : 결혼식  (0) 2021.02.17
[백준] 5427번 : 불  (0) 2021.02.17
Comments