문제 링크
접근 방법
- 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;
}