1+ import sys
2+ from collections import deque
3+ input = sys .stdin .readline
4+
5+ # 입력
6+ N , M , K = map (int , input ().split ())
7+ grid = [[deque ([]) for _ in range (N )] for _ in range (N )]
8+ for _ in range (M ):
9+ r , c , m , s , d = map (int , input ().split ())
10+ grid [r - 1 ][c - 1 ].append ([m , s , d ])
11+
12+ # 방향벡터
13+ directions = [(- 1 , 0 ), (- 1 , 1 ), (0 , 1 ), (1 , 1 ),
14+ (1 , 0 ), (1 , - 1 ), (0 , - 1 ), (- 1 , - 1 )]
15+
16+ # K번만큼 반복
17+ temp_grid = [[deque () for _ in range (N )] for _ in range (N )]
18+
19+ for _ in range (K ):
20+ # 1. 이동하기
21+ temp_grid [i ][j ].clear () # 기존 구조 초기화
22+
23+ for i in range (N ):
24+ for j in range (N ):
25+ while grid [i ][j ]:
26+ m , s , d = grid [i ][j ].popleft ()
27+ dx , dy = directions [d ]
28+ nx , ny = (i + dx * s ) % N , (j + dy * s ) % N
29+ temp_grid [nx ][ny ].append ([m , s , d ])
30+ grid = temp_grid
31+
32+ # 2. 2개 이상의 파이어볼 칸은 합치고 나누기
33+ for i in range (N ):
34+ for j in range (N ):
35+ # 한 칸에 두 개 이상 있을 경우
36+ if len (grid [i ][j ]) > 1 :
37+ sum_m , sum_s , cnt_odd , cnt_even = 0 , 0 , 0 , 0
38+ cnt_total = len (grid [i ][j ])
39+
40+ # 합치기
41+ while grid [i ][j ]:
42+ m , s , d = grid [i ][j ].popleft ()
43+ sum_m += m
44+ sum_s += s
45+ if d % 2 == 0 :
46+ cnt_even += 1
47+ else :
48+ cnt_odd += 1
49+
50+ # 방향 결정
51+ if cnt_odd == cnt_total or cnt_even == cnt_total :
52+ d_list = [0 , 2 , 4 , 6 ]
53+ else :
54+ d_list = [1 , 3 , 5 , 7 ]
55+
56+ # 나누기
57+ new_m = sum_m // 5 # 질량
58+ new_s = sum_s // cnt_total # 속력
59+
60+ if new_m > 0 : # 질량이 0 이면 소멸
61+ for d in d_list : # 방향
62+ grid [i ][j ].append ([new_m , new_s , d ])
63+
64+ # 정답(파이어볼 질량의 합) 구하기
65+ answer = 0
66+ for i in range (N ):
67+ for j in range (N ):
68+ for m , s , d in grid [i ][j ]:
69+ answer += m
70+
71+ print (answer )
0 commit comments