11-01 00:00
- Today
- Total
													Link
													
												
											
												
												
											
									개발하는 고라니
[백준] 4179번 : 불! 본문
반응형
    
    
    
  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