반응형
https://www.acmicpc.net/problem/21610
#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;
}
반응형
'Algorithm > problem' 카테고리의 다른 글
백준 23288번 : 주사위 굴리기 2, 시뮬레이션 C++ (0) | 2022.08.26 |
---|---|
백준 21611번: 마법사 상어와 블리자드 - C++ (0) | 2022.08.25 |
백준 21608번 : 상어 초등학교 - 구현, 시뮬레이션 C++ (0) | 2022.07.31 |
백준 20058번 : 마법사 상어와 파이어스톰 - 구현, 시뮬레이션 C++ (0) | 2022.07.29 |
백준 20057번 : 마법사 상어와 토네이도 (0) | 2022.07.28 |