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;
   }
}

Tags:

Categories:

Updated:

Comments