반응형

https://www.acmicpc.net/problem/21610

 

21610번: 마법사 상어와 비바라기

마법사 상어는 파이어볼, 토네이도, 파이어스톰, 물복사버그 마법을 할 수 있다. 오늘 새로 배운 마법은 비바라기이다. 비바라기를 시전하면 하늘에 비구름을 만들 수 있다. 오늘은 비바라기

www.acmicpc.net

#include <bits/stdc++.h>
using namespace std;

int N, M, A[51][51];
bool cloudCheck[51][51];
vector<pair<int, int>> cloudPosition;

int dx[8] = {0, -1, -1, -1, 0, 1, 1, 1};
int dy[8] = {-1, -1, 0, 1, 1, 1, 0, -1};

void cloudMove(int d, int s) {
  for (int i = 0; i < cloudPosition.size(); i++) {
    int x = cloudPosition[i].first;
    int y = cloudPosition[i].second;

    int nx = (x + dx[d] * s) % N;
    nx = nx <= 0 ? nx + N : nx;

    int ny = (y + dy[d] * s) % N;
    ny = ny <= 0 ? ny + N : ny;

    cloudCheck[nx][ny] = 1;
    A[nx][ny]++;

    cloudPosition[i].first = nx;
    cloudPosition[i].second = ny;
  }
}

void waterCopyBug() {
  for (int i = 0; i < cloudPosition.size(); i++) {
    int x = cloudPosition[i].first;
    int y = cloudPosition[i].second;

    int cnt = 0;
    for (int j = 1; j < 8; j += 2) {
      int nx = x + dx[j];
      int ny = y + dy[j];

      if (nx <= 0 || nx > N || ny <= 0 || ny > N)
        continue;

      if (A[nx][ny] > 0)
        cnt++;
    }

    A[x][y] += cnt;
  }
}

void makeCloud() {
  cloudPosition.clear();
  for (int i = 1; i <= N; i++) {
    for (int j = 1; j <= N; j++) {
      if (!cloudCheck[i][j] && A[i][j] >= 2) {
        cloudPosition.push_back({i, j});
        A[i][j] -= 2;
      }
    }
  }

  memset(cloudCheck, 0, sizeof(cloudCheck));
}

int main() {
  ios::sync_with_stdio(0);
  cin.tie(0);

  cin >> N >> M;
  for (int i = 1; i <= N; i++) {
    for (int j = 1; j <= N; j++) {
      cin >> A[i][j];
    }
  }

  cloudPosition.push_back({N, 1});
  cloudPosition.push_back({N, 2});
  cloudPosition.push_back({N - 1, 1});
  cloudPosition.push_back({N - 1, 2});

  for (int i = 1; i <= M; i++) {
    int d, s;
    cin >> d >> s;
    cloudMove(d - 1, s);
    waterCopyBug();
    makeCloud();
  }

  int ans = 0;
  for (int i = 1; i <= N; i++) {
    for (int j = 1; j <= N; j++) {
      ans += A[i][j];
    }
  }

  cout << ans;
  return 0;
}
반응형

+ Recent posts