ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • boj)4179 - 불!
    PS/boj 2020. 10. 17. 16:59
    import java.io.*;
    import java.util.*;
    
    public class boj_4179 {
        static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        static StringTokenizer st;
        static Queue<Node> qF = new LinkedList<>();
        static Queue<Node> qJ = new LinkedList<>();
        static char[][] a;
        static int row, col, nx, ny, ans;
        static int[] dx = {-1, 1, 0, 0};
        static int[] dy = {0, 0, -1, 1};
    
        public static void main(String[] args) throws IOException {
            input();
            if (bfs()) System.out.println(ans);
            else System.out.println("IMPOSSIBLE");
        }
    
        public static void input() throws IOException {
            st = new StringTokenizer(br.readLine());
    
            row = Integer.parseInt(st.nextToken());
            col = Integer.parseInt(st.nextToken());
            a = new char[row][col];
    
            for (int i = 0; i < row; i++) {
                a[i] = br.readLine().toCharArray();
                for (int j = 0; j < col; j++) {
                    if (a[i][j] == 'F') {
                        qF.offer(new Node(i, j, 0));
                    } else if (a[i][j] == 'J') {
                        qJ.offer(new Node(i, j, 0));
                    }
                }
            }
        }
    
        public static boolean bfs() {
            while (!qJ.isEmpty()) {
    
                int size = qF.size();
                for (int i = 0; i < size; i++) {
                    Node now = qF.poll();
    
                    for (int j = 0; j < 4; j++) {
                        nx = now.x + dx[j];
                        ny = now.y + dy[j];
    
                        if (nx < 0 || nx >= row || ny < 0 || ny >= col) continue;
                        if (a[nx][ny] == '#' || a[nx][ny] == 'F') continue;
    
                        a[nx][ny] = 'F';
                        qF.offer(new Node(nx, ny, now.d + 1));
                    }
                }
    
                size = qJ.size();
                for (int i = 0; i < size; i++) {
                    Node now = qJ.poll();
    
                    for (int j = 0; j < 4; j++) {
                        nx = now.x + dx[j];
                        ny = now.y + dy[j];
    
                        if (nx <  0 || nx >= row || ny < 0 || ny >= col) {
                            ans = now.d + 1;
                            return true;
                        }
    
                        if (a[nx][ny] == '#' || a[nx][ny] == 'F' || a[nx][ny] == 'J') continue;
                        a[nx][ny] = 'J';
                        qJ.offer(new Node(nx, ny, now.d + 1));
                    }
                }
            }
    
            return false;
        }
    
        static private class Node {
            int x;
            int y;
            int d;
    
            public Node(int x, int y, int d) {
                this.x = x;
                this.y = y;
                this.d = d;
            }
        }
    }
    

     

    - 실패

     

    - 불 먼저 이동후 - > 지훈이는 불을 피해다니며 이동

    - 지훈이가 완전히 탈출할때까지 반복

    - 지훈이가 만약 범위를 벗어난다면 그때의 시간인 now.d + 1을 출력후 return true

    - 큐가 빌때까지 반복했는데도 탈출하지 못한다면 return false

    - true : ans+1, false : impossible 출력

    'PS > boj' 카테고리의 다른 글

    boj)7569 - 토마토  (0) 2020.10.19
    boj)1697 - 숨바꼭질  (0) 2020.10.17
    boj)1926 - 그림  (0) 2020.10.15
    boj)10866 - 덱  (0) 2020.10.14
    boj)4889 - 안정적인 문자열  (0) 2020.10.14
킹수빈닷컴