Algorithm/baekjoon

봄버맨

마닐라 2022. 1. 27. 20:20

📍 문제 설명

 

💡 접근

1초 경과 - 그대로

2초 경과 - 모든 칸에 폭탄 설치

3초 경과 - 폭탄 설치된 칸에서 폭발(1초)

4초 경과 - 모든 칸에 폭탄 설치

5초 경과 - 3초 전에 설치된 폭탄이 폭발(3초)

 

2,3 4,5 초와 같이 설치, 폭발이 반복된다.

1.폭탄 좌표를 큐에 넣는다.

2.모든 좌표에 폭탄을 설치한다.

3.폭탄 좌표를 폭발시킨다.

1~3을 반복하면된다.

👩‍💻 코드

import java.util.*;

public class Main {
    static int n, m, k, answer, cnt, max, min, sum, count, r, c;
    static char[][] board, clone, dis;
    static boolean[][] visited;
    static int[] ch, pm, combi, graph, temp;
    static boolean flag = false;
    static int[] dx = {-1, 0, 1, 0,}; //북동남서
    static int[] dy = {0, 1, 0, -1};
    static ArrayList<Integer> list = new ArrayList<>();
    static Queue<Point> q;

    public static void main(String[] args) {
        Main T = new Main();
        Scanner kb = new Scanner(System.in);

        r = kb.nextInt();
        c = kb.nextInt();
        n = kb.nextInt();
        board = new char[r][c];
        kb.nextLine();

        //3초가 지난뒤 폭발(해당 칸 포함 상하좌우 파괴)
        //인접한 칸에 폭탄이 있으면 파괴만 된다.
        for(int i = 0; i < r; i++) {
            String s = kb.nextLine();
            for(int j = 0; j < c; j++) {
                board[i][j] = s.charAt(j);
            }
        }

        T.solution(1);

    }


    private void solution(int second) {
        q = new LinkedList<>();
        if(second == n) {
            for(int i = 0; i < r; i++) {
                for(int j = 0; j < c; j++) {
                    System.out.print(board[i][j]);
                }
                System.out.println();
            }
            return;
        }
        //폭탄 좌표 큐에 넣기
        for(int i = 0; i < r; i++) {
            for(int j = 0; j < c; j++) {
                if(board[i][j] == 'O') q.offer(new Point(i, j));
            }
        }
        
        //폭탄이 없는 곳 모든 칸에 폭탄 설치 - 1초 증가
        for(int i = 0; i < r; i++) {
            for(int j = 0; j < c; j++) {
                if(board[i][j] == '.') board[i][j] = 'O';
            }
        }
        second++;
        if(second == n) {
            solution(second);
            return;
        }

        //좌표를 기준으로 상하좌우 폭발 - 1초 증가
        while(!q.isEmpty()) {
            Point cp = q.poll();
            board[cp.x][cp.y] = '.';
            for(int i = 0; i < 4; i++) {
                int nx = cp.x + dx[i];
                int ny = cp.y + dy[i];
                if(nx<0 || ny<0 || nx>=r || ny>=c) continue;
                board[nx][ny] = '.';
            }
        }
        second++;
        solution(second);

    }

    private static class Point {
        private int x;
        private int y;

        public Point(int x, int y) {
            this.x = x;
            this.y = y;
        }

        @Override
        public String toString() {
            return "Point{" +
                    "x=" + x +
                    ", y=" + y +
                    '}';
        }
    }
}

'Algorithm > baekjoon' 카테고리의 다른 글

쇠막대기  (0) 2022.01.27
괄호  (0) 2022.01.27
미세먼지 안녕  (0) 2022.01.27
경사로  (0) 2022.01.26
인구이동  (0) 2022.01.26