파이어볼을 부리는 상어가 명령을 K 번 했을 때, 남은 파이어볼의 질량을 구하자!
마법사 상어가 모든 파이어볼에게 이동을 명령하면 다음이 일들이 일어난다.
정확한 시뮬레이션이 중요하다.
매 명령마다 2차원 배열을 돌면서 파이어볼이 존재할 때 요구하는 작업들을 해주면 된다.
rollable matrix에 대해 인덱싱을 잘 해주자!
rollable이라고 처음에 속력들을 받아서 저장할 때 %N 처리를 해주었었다. 하지만 이렇게 하면 문제가 있는 게 파이어볼이 나뉘어진 자식들은 속력의 합/형제수라는 것이다. 속력의 합이 mod가 들어가버리면 똑같이 나오지 않는다.
위 아래 예시들의 파이어볼 A와 파이어볼 B는 똑같이 동작하지만 이들이 합쳐진 뒤 자식? 파이어볼의 속력은 다르다.
#include<iostream>
#include<vector>
using namespace std;
int N, M, K;
struct fire {
int m, s, d;
fire(int mm, int ss, int dd) {
m = mm; s = ss; d = dd;
}
fire() {
m = 0; s = 0; d = 0;
}
};
struct pt {
int i, j;
pt(int ii, int jj) {
i = ii % N;
j = jj % N;
if (i < 0) {
i += N;
}
if (j < 0) {
j += N;
}
}
};
vector<fire> arr[50][50];
vector<fire> empty_arr[50][50];
int di[] = { -1,-1,0,1,1,1,0,-1 };
int dj[] = { 0,1,1,1,0,-1,-1,-1 };
int pd[] = { 0, 2, 4, 6 };
int upd[] = { 1, 3, 5, 7 };
int main() {
cin >> N >> M >> K;
int r, c, m, s, d;
for (int i = 0; i < M; i++) {
cin >> r >> c >> m >> s >> d;
arr[r-1][c-1].push_back(fire(m, s, d));
}
for (int ctr = 0; ctr < K; ctr++) {
vector<fire> temp[50][50];
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
for (int k = 0; k < arr[i][j].size(); k++) {
fire cur = arr[i][j][k];
if (cur.m != 0) {
pt next_pt = pt(i + cur.s * di[cur.d], j + cur.s * dj[cur.d]);
temp[next_pt.i][next_pt.j].push_back(cur);
}
}
}
}
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
arr[i][j] = vector<fire>();
}
}
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
if (temp[i][j].size() == 1) {
arr[i][j].push_back(temp[i][j][0]);
}
if (temp[i][j].size() >= 2) {
int sum_m = 0, sum_s = 0, sum_odd=0;
for (int k = 0; k < temp[i][j].size(); k++) {
sum_m += temp[i][j][k].m;
sum_s += temp[i][j][k].s;
if (temp[i][j][k].d % 2 == 1) {
sum_odd++;
}
}
int child_m = sum_m / 5, child_s = (sum_s / temp[i][j].size());
bool is_pure = (sum_odd == temp[i][j].size() || sum_odd == 0);
if (child_m != 0) {
for (int k = 0; k < 4; k++) {
int dir = (is_pure ? pd[k] : upd[k]);
fire child = fire(child_m, child_s, dir);
arr[i][j].push_back(child);
}
}
}
}
}
}
int sum_m = 0;
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
for (int k = 0; k < arr[i][j].size(); k++) {
sum_m += arr[i][j][k].m;
}
}
}
cout << sum_m << endl;
}