마법사 상어가 토네이도를 일으키며 먼지를 뿌리고 다니는 걸 시뮬레이션 하라!
정확한 시뮬레이션
단계 시작 -> ⓧ -> 중심 움직임 -> ⓨ -> 모래 흩날림 -> ⓐ를 x에서 y 구하듯이 구함 -> y에 모래를 비우고 a에 남은 모래를 넣음
으로 구현했다.
문제에 써있는대로 아주 정확하게 중심이 움직이자마자 y에 모래를 비우는 것도 좋았을 것 같다.
#include<iostream>
#include<iomanip>
using namespace std;
int arr[500][500];//499도 됨
int N;
int sum_out = 0;
int knl[4][5][5];
bool in_box(int i, int j) {
return i >= 0 && i < N&& j >= 0 && j < N;
}
int new_d(int d) {
if(d == 3){
d = 0;
}
else {
d++;
}
return d;
}
int power(int mi, int mj,int v) {
int si = mi - 2, sj = mj - 2;
int mother = arr[mi][mj];
int left = mother;
for (int i = 0; i < 5; i++) {
for (int j = 0; j < 5; j++) {
int child = mother * ((double)knl[v][i][j] / (double)100);
if (child == 0) continue;
left -= child;
if (in_box(si + i, sj + j)) {
arr[si + i][sj + j] += child;
}
else {
sum_out += child;
}
}
}
return left;
}
int di[] = { 0, 1,0,-1 };
int dj[] = { -1,0,1,0 };
int **ker;
int r0[] = { 0,0,2,0,0 };
int r1[] = { 0,10,7,1,0 };
int r2[] = { 5, 0, 0,0,0 };
int main() {
ker = new int* [5];
ker[0] = r0; ker[1] = r1; ker[2] = r2; ker[3] = r1; ker[4] = r0;
for (int i = 0; i < 5; i++) {
for (int j = 0; j < 5; j++) {
knl[0][i][j] = ker[i][j];
knl[1][4 - j][i] = ker[i][j];
knl[2][4 - i][4 - j] = ker[i][j];
knl[3][j][4 - i] = ker[i][j];
}
}
cin >> N;
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
cin >> arr[i][j];
}
}
int mid = N / 2;
int sz = 1;
int lsz = sz;//left size
int i = mid, j = mid;
int d = 0;
int ctr = 0;
while (true) {
i += di[d]; j += dj[d];//y
lsz--;
int a = power(i, j, d);
int ai = i + di[d], aj = j + dj[d];
if (in_box(ai, aj)) {
arr[ai][aj] += a;
arr[i][j] = 0;
}
else {
sum_out += a;
}
if (i == 0 && j == 0) {
break;
}
if (lsz == 0) {
if (d == 1||d ==3) {
sz++;
}
lsz = sz;
d = new_d(d);
}
ctr++;
}
cout << sum_out << endl;
}