BOJ 16919 - 봄버맨 2

image.png

문제의 특성상 열심히 구현하다보면 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;
   }
}

Tags:

Categories:

Updated:

Comments