https://www.acmicpc.net/problem/16235
"""
"""
from collections import deque
from sys import stdin
input = stdin.readline
n, m, k = map(int, input().split()) # n : 땅의 크기, m : 나무의 개수, k : 시간(년)
A = [ list(map(int, input().split())) for _ in range(n) ] # 양분의 양을 기록해놓은 2차원 배열
tree = [ [ deque() for _ in range(n) ] for _ in range(n) ] # 나무의 나이를 기록해놓은 3차원 배열
pan = [ [5] * n for _ in range(n) ] # 땅의 양분을 기록해놓은 2차원 배열
for _ in range(m): # 나무의 좌표에 나이를 기록한다.
x, y, z = map(int, input().split())
tree[x-1][y-1].append(z)
def spring_summer(): # 봄, 여름
for i in range(n):
for j in range(n):
tree_cnt = len(tree[i][j])
for k in range(tree_cnt): # 나무가 있는 좌표에 나무 개수만큼 반복문을 진행한다.
if pan[i][j] >= tree[i][j][k]: # 땅에 양분이 풍족한 경우 (봄)
pan[i][j] -= tree[i][j][k] # 나무가 자신의 나이만큼 양분을 먹음
tree[i][j][k] += 1
else: # 땅에 양분이 부족해 나무가 죽는 경우 (여름)
for _ in range(k, tree_cnt): # pop()을 통해 나이가 많은 것 부터 양분으로 변환시킨다.
pan[i][j] += tree[i][j].pop() // 2
break
dx, dy = [-1, -1, -1, 0, 1, 1, 1, 0], [-1, 0, 1, 1, 1, 0, -1, -1]
def fall_winter(): # 가을, 겨울
for x in range(n):
for y in range(n):
tree_cnt = len(tree[x][y])
for k in range(tree_cnt): # 나무가 있는 좌표에 나무 개수만큼 반복문을 진행한다.
if tree[x][y][k] % 5 == 0: # 나이가 5의 배수이면 8방향으로 범위를 확인 후 번식을 진행한다 (가을)
for l in range(8):
mx = x + dx[l]
my = y + dy[l]
if 0 <= mx < n and 0 <= my < n:
tree[mx][my].appendleft(1) # appendleft를 통해 오름차순을 유지해준다.
pan[x][y] += A[x][y] # 전체 반복문으로 양분을 추가해준다 (겨울)
for _ in range(k):
spring_summer()
fall_winter()
answer = 0
for i in range(n):
for j in range(n):
answer += len(tree[i][j]) # 한 좌표에 나무가 2개 이상인 경우가 있으므로 이렇게 나무의 개수를 구해준다
print(answer)
spring_summer()에 i, j 부분과
fall_winter()에 x, y 부분이 있는데
fall_winter()에 무심코 i, j를 썼다가 오답이 나옴
spring_summer()과 fall_winter()은 같은 반복문 내에 있으므로 변수를 공유하기 때문에 i, j가 중복되어 이상한 값이 들어간다. 이런 부분 작은 실수이지만 왜 오답인지 찾기가 어려우니 조심하자.