Blog

ENGINEERING NOTE

[백준] 봄버맨

백준 봄버맨0초 - 일부 칸 폭탄 설치(초기상태)1초 - 행동 X2초 - 폭탄 없는 칸에 전부 폭탄 설치3초 - 행동 X(0초 때 설치해 뒀던 폭탄 터짐)이후 2초, 3초 행동 반복따라서 짝수초의 격자판의 상태만 계산해주면 된다.

코딩테스트

문제 링크

백준 봄버맨

접근 방법

  • 0초 - 일부 칸 폭탄 설치(초기상태)
  • 1초 - 행동 X
  • 2초 - 폭탄 없는 칸에 전부 폭탄 설치
  • 3초 - 행동 X(0초 때 설치해 뒀던 폭탄 터짐)
  • 이후 2초, 3초 행동 반복

따라서 짝수초의 격자판의 상태만 계산해주면 된다.


풀이 코드

text
#include <iostream>
#include <queue>

using namespace std;

char a[201][201];
int dx[4] = { 1,0,-1,0 };
int dy[4] = { 0,1,0,-1 };


int main() {
	ios::sync_with_stdio(false);
	cin.tie(NULL);
	cout.tie(NULL);

	int R, C, N;

	cin >> R >> C >> N;

	// 초기 상태를 입력받는다.
    for (int i = 0; i < R; i++) {
        for (int j = 0; j < C; j++) {
			cin >> a[i][j];
        }
    }

    // 2의 배수 초 후엔 항상 모든 칸에 폭탄
    if (N % 2 == 0) {
        for (int i = 0; i < R; i++) {
            for (int j = 0; j < C; j++) {
				cout << 'O';
            }
            cout << endl;
        }
        return 0;
    }

    int time = 1;
    queue<pair<int, int>> q;

    while (time < N) {
        // 폭탄의 위치를 저장한다
        for (int i = 0; i < R; i++) {
            for (int j = 0; j < C; j++) {
                if (a[i][j] == 'O') {
                    q.push(make_pair(i, j));
                }
            }
        }

        // 전체 초기화
        for (int i = 0; i < R; i++) {
            for (int j = 0; j < C; j++) {
                a[i][j] = 'O';
            }
        }

		// 폭탄이 터진 위치를 '.'로 바꾼다
        while (!q.empty()) {

            int nowR = q.front().first;
            int nowC = q.front().second;
            q.pop();
			// 폭탄이 터진 위치를 '.'로 바꾼다
            a[nowR][nowC] = '.';
			// 상하좌우를 '.'로 바꾼다
            for (int i = 0; i < 4; i++) {
                int nextR = nowR + dx[i];
                int nextC = nowC + dy[i];
				// 범위를 벗어나는 경우
                if (nextR < 0 || nextR >= R || nextC < 0 || nextC >= C)
                    continue;
                a[nextR][nextC] = '.';
            }
        }


        time += 2;

    }
    
	// 결과 출력하기
    for (int i = 0; i < R; i++) {
        for (int j = 0; j < C; j++) {
			cout << a[i][j];
        }
        cout << endl;
    }

	return 0;
}