Skip to content

Commit 15c1179

Browse files
committed
[Silver I] Title: 봄버맨, Time: 32 ms, Memory: 2224 KB -BaekjoonHub
1 parent 8c338b0 commit 15c1179

2 files changed

Lines changed: 136 additions & 0 deletions

File tree

Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
# [Silver I] 봄버맨 - 16918
2+
3+
[문제 링크](https://www.acmicpc.net/problem/16918)
4+
5+
### 성능 요약
6+
7+
메모리: 2224 KB, 시간: 32 ms
8+
9+
### 분류
10+
11+
구현, 시뮬레이션
12+
13+
### 제출 일자
14+
15+
2025년 7월 23일 14:04:29
16+
17+
### 문제 설명
18+
19+
<p><a href="https://en.wikipedia.org/wiki/Bomberman">봄버맨</a>은 크기가 R×C인 직사각형 격자판 위에서 살고 있다. 격자의 각 칸은 비어있거나 폭탄이 들어있다.</p>
20+
21+
<p>폭탄이 있는 칸은 3초가 지난 후에 폭발하고, 폭탄이 폭발한 이후에는 폭탄이 있던 칸이 파괴되어 빈 칸이 되며, 인접한 네 칸도 함께 파괴된다. 즉, 폭탄이 있던 칸이 (i, j)인 경우에 (i+1, j), (i-1, j), (i, j+1), (i, j-1)도 함께 파괴된다. 만약, 폭탄이 폭발했을 때, 인접한 칸에 폭탄이 있는 경우에는 인접한 폭탄은 폭발 없이 파괴된다. 따라서, 연쇄 반응은 없다.</p>
22+
23+
<p>봄버맨은 폭탄에 면역력을 가지고 있어서, 격자판의 모든 칸을 자유롭게 이동할 수 있다. 봄버맨은 다음과 같이 행동한다.</p>
24+
25+
<ul>
26+
<li>가장 처음에 봄버맨은 일부 칸에 폭탄을 설치해 놓는다. 모든 폭탄이 설치된 시간은 같다.</li>
27+
<li>다음 1초 동안 봄버맨은 아무것도 하지 않는다.</li>
28+
<li>다음 1초 동안 폭탄이 설치되어 있지 않은 모든 칸에 폭탄을 설치한다. 즉, 모든 칸은 폭탄을 가지고 있게 된다. 폭탄은 모두 동시에 설치했다고 가정한다.</li>
29+
<li>1초가 지난 후에 3초 전에 설치된 폭탄이 모두 폭발한다.</li>
30+
<li>3과 4를 반복한다.</li>
31+
</ul>
32+
33+
<p>폭탄을 설치해놓은 초기 상태가 주어졌을 때, N초가 흐른 후의 격자판 상태를 구하려고 한다.</p>
34+
35+
<p>예를 들어, 초기 상태가 아래와 같은 경우를 보자.</p>
36+
37+
<pre>...
38+
.O.
39+
...</pre>
40+
41+
<p>1초가 지난 후에는 아무 일도 벌어지지 않기 때문에, 위와 같다고 볼 수 있다. 1초가 더 흐른 후에 격자판의 상태는 아래와 같아진다.</p>
42+
43+
<pre>OOO
44+
OOO
45+
OOO</pre>
46+
47+
<p>1초가 지난 후엔 가운데에 있는 폭탄이 폭발해 가운데 칸과 인접한 네 칸이 빈 칸이 된다.</p>
48+
49+
<pre>O.O
50+
...
51+
O.O
52+
</pre>
53+
54+
### 입력
55+
56+
<p>첫째 줄에 R, C, N (1 ≤ R, C, N ≤ 200)이 주어진다. 둘째 줄부터 R개의 줄에 격자판의 초기 상태가 주어진다. 빈 칸은 '<code>.</code>'로, 폭탄은 '<code>O</code>'로 주어진다.</p>
57+
58+
### 출력
59+
60+
<p>총 R개의 줄에 N초가 지난 후의 격자판 상태를 출력한다.</p>
61+
Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,75 @@
1+
#include<iostream>
2+
3+
using namespace std;
4+
5+
int R, C, N;
6+
char arr[205][205]{};
7+
int timer[205][205]{};
8+
int dx[4] = { 1,0,-1,0 };
9+
int dy[4] = { 0,1,0,-1 };
10+
11+
void initMap() {
12+
cin >> R >> C >> N;
13+
14+
for (int i = 0; i < R; i++)
15+
for (int j = 0; j < C; j++)
16+
cin >> arr[i][j];
17+
}
18+
19+
void incTimer() {
20+
for (int i = 0; i < R; i++)
21+
for (int j = 0; j < C; j++)
22+
if (arr[i][j] == 'O')
23+
timer[i][j]++;
24+
}
25+
26+
void plantBomb() {
27+
for (int i = 0; i < R; i++)
28+
for (int j = 0; j < C; j++)
29+
if (arr[i][j] == '.')
30+
arr[i][j] = 'O';
31+
}
32+
33+
void explodeBomb() {
34+
for (int i = 0; i < R; i++)
35+
for (int j = 0; j < C; j++)
36+
if (timer[i][j] == 3) {
37+
timer[i][j] = 0; // timer 초기화
38+
arr[i][j] = '.'; // 폭발시키기
39+
for (int k = 0; k < 4; k++) { // timer가 3이 아닌 인접 폭탄 제거
40+
int nx = i + dx[k];
41+
int ny = j + dy[k];
42+
if (arr[nx][ny] == 'O' && timer[nx][ny] < 3) {
43+
timer[nx][ny] = 0;
44+
arr[nx][ny] = '.';
45+
}
46+
}
47+
}
48+
}
49+
50+
void printMap() {
51+
for (int i = 0; i < R; i++) {
52+
for (int j = 0; j < C; j++)
53+
cout << arr[i][j];
54+
cout << '\n';
55+
}
56+
}
57+
58+
int main() {
59+
cin.tie(0)->sync_with_stdio(0);
60+
61+
initMap();
62+
63+
for (int i = 1; i < N + 1; i++) {
64+
incTimer(); // arr을 검사해서, O이면, timer++;
65+
if (i == 1) continue;
66+
67+
if (!(i % 2)) // i가 짝수면 '.'인 곳에 폭탄 설치
68+
plantBomb();
69+
else // i가 홀수면 timer 검사해서 폭발시키고, 폭발된 곳 timer reset
70+
explodeBomb();
71+
}
72+
printMap();
73+
74+
return 0;
75+
}

0 commit comments

Comments
 (0)