BOJ 16919 - 봄버맨 2
문제의 특성상 열심히 구현하다보면 4번마다 주기가 나타남을 알 수 있고 $N$ 을 적절히 $4$로 나눠서 반복을 없애고 구해줄 수 있다.
const int dy[] = {-1, 0, 1, 0}, dx[] = {0, 1, 0, -1}, op[] = {2, 3, 0, 1};
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;
for (int t = 2; t <= N; t++) {
int q = (N - t) / 4;
N -= 4 * q;
if (t % 2 == 0) {
// 폭탄 설치
for (int y = 0; y < Y; y++)
for (int x = 0; x < X; x++) {
if (bomb[y][x] == -1) {
bomb[y][x] = t;
}
}
} else {
auto copy = bomb;
for (int y = 0; y < Y; y++)
for (int x = 0; x < X; x++) {
if (bomb[y][x] != -1 && bomb[y][x] == t - 3) {
copy[y][x] = -1;
for (int d = 0; d < 4; d++) {
int ny = y + dy[d];
int nx = x + dx[d];
if (ny >= 0 && ny < Y && nx >= 0 && nx < X) copy[ny][nx] = -1;
}
}
}
bomb = copy;
}
}
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