Skip to content

Commit 58d9e53

Browse files
authored
[BOJ] 20056 마법사 상어와 파이어볼 (G4)
1 parent 315b573 commit 58d9e53

File tree

1 file changed

+117
-0
lines changed

1 file changed

+117
-0
lines changed

박예진/8주차/260220.cpp

Lines changed: 117 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,117 @@
1+
#include <iostream>
2+
#include <vector>
3+
using namespace std;
4+
5+
/*
6+
이동하는 중 같은 칸 여러개 파이어볼 있을 수 있음
7+
2개 이상의 파이어볼 칸
8+
1. 합쳐짐
9+
2. 4개의 파이어볼로 나뉨
10+
질량 0 소멸
11+
*/
12+
13+
struct Ball {
14+
int m, d, s; // 질량, 방향, 속력
15+
};
16+
17+
const int dx[8] = {-1, -1, 0, 1, 1, 1, 0, -1};
18+
const int dy[8] = {0, 1, 1, 1, 0, -1, -1, -1};
19+
20+
int N, M, K; // 격자, 파이어볼 개수, 명령어 개수
21+
vector<Ball> arr[51][51];
22+
vector<Ball> temp[51][51];
23+
24+
void move(int x, int y){
25+
for(auto ball : arr[x][y]) {
26+
int nx = (x + dx[ball.d] * ball.s) % N;
27+
if (nx < 0) nx += N;
28+
29+
int ny = (y + dy[ball.d] * ball.s) % N;
30+
if (ny < 0) ny += N;
31+
32+
temp[nx][ny].push_back({ball.m, ball.d, ball.s});
33+
}
34+
}
35+
36+
int main() {
37+
ios::sync_with_stdio(false);
38+
cin.tie(0); cout.tie(0);
39+
40+
cin >> N >> M >> K;
41+
42+
// 파이어볼 정보
43+
for(int i = 0; i < M; i++){
44+
int r, c, m, s, d;;
45+
cin >> r >> c >> m >> s >> d;
46+
arr[r - 1][c - 1].push_back({m, d, s});
47+
}
48+
49+
while(K--) {
50+
// 1. 모든 파이어볼 이동
51+
for (int i = 0; i < N; i++) {
52+
for (int j = 0; j < N; j++) {
53+
temp[i][j].clear();
54+
}
55+
}
56+
for (int i = 0; i < N; i++) {
57+
for (int j = 0; j < N; j++) {
58+
if (arr[i][j].size() > 0) {
59+
move(i, j);
60+
}
61+
}
62+
}
63+
// 깊은 복사
64+
for (int i = 0; i < N; i++) {
65+
for (int j = 0; j < N; j++) {
66+
arr[i][j] = temp[i][j];
67+
}
68+
}
69+
70+
// 2. 2개 이상의 파이어볼 있는 칸
71+
for (int i = 0; i < N; i++) {
72+
for (int j = 0; j < N; j++) {
73+
if (arr[i][j].size() >= 2) {
74+
int msum = 0, ssum = 0;
75+
int oddcnt = 0, evencnt = 0;
76+
77+
for(int k = 0; k < arr[i][j].size(); k++){
78+
msum += arr[i][j][k].m;
79+
ssum += arr[i][j][k].s;
80+
if (arr[i][j][k].d % 2 == 0) evencnt++;
81+
else oddcnt++;
82+
}
83+
84+
int osize = arr[i][j].size();
85+
arr[i][j].clear(); // 초기화
86+
87+
msum /= 5;
88+
if (msum == 0) continue;
89+
ssum /= osize;
90+
91+
// 4개의 파이어볼로 나뉘어짐
92+
int dnum = 0;
93+
if (evencnt == 0 || oddcnt == 0) dnum = 0;
94+
else dnum = 1;
95+
96+
for(int k = 0; k < 4; k++){
97+
arr[i][j].push_back({msum, dnum, ssum});
98+
dnum += 2;
99+
}
100+
}
101+
}
102+
}
103+
}
104+
105+
// 최종 남아있는 파이어볼 질량의 합
106+
int msum = 0;
107+
for(int i = 0; i < N; i++){
108+
for(int j = 0; j < N; j++){
109+
for(int k = 0; k < arr[i][j].size(); k++){
110+
msum += arr[i][j][k].m;
111+
}
112+
}
113+
}
114+
cout << msum;
115+
116+
return 0;
117+
}

0 commit comments

Comments
 (0)