BOJ - 봄버맨
오랜만에 구현을 해서 문제에서 하라는대로 하기가 쉽지 않았다.
폭탄이 가진 숫자를 1초마다 1씩 줄여주기보다 폭탄이 설치된 시간과 현재 시간을 비교해서 3 이상 차이난다면 터뜨려주는 것이 코드를 짜기에 수월하다.
void solve() {
int Y, X, N;
cin >> Y >> X >> N;
vs b(Y);
fv(b);
vvi bomb(Y, vi(X, -1));
for (int y = 0; y < Y; y++)
for (int x = 0; x < X; x++) if (b[y][x] == 'O') bomb[y][x] = 0;
int t = 0;
auto elapse = [&]() {
vvi removed(Y, vi(X));
for (int y = 0; y < Y; y++)
for (int x = 0; x < X; x++) {
if (bomb[y][x] <= t - 3 && ~bomb[y][x]) {
for (int d = 0; d < 4; d++) {
int ny = y + dy[d], nx = x + dx[d];
if (ny >= 0 && ny < Y && nx >= 0 && nx < X) {
removed[ny][nx] = 1;
}
}
removed[y][x] = 1;
}
}
for (int y = 0; y < Y; y++)
for (int x = 0; x < X; x++) if (removed[y][x]) bomb[y][x] = -1;
};
t++;
for (; t < N;) {
for (int y = 0; y < Y; y++)
for (int x = 0; x < X; x++) {
if (bomb[y][x] == -1) {
bomb[y][x] = t;
}
}
t++;
if (t == N) break;
t++;
elapse();
}
for (int y = 0; y < Y; y++) {
for (int x = 0; x < X; x++) {
if (bomb[y][x] != -1) cout << 'O';
else cout << '.';
}
cout << endl;
}
}
Comments