url: https://www.codetree.ai/training-field/frequent-problems/problems/tree-kill-all/description?page=1&pageSize=20
소요시간 : 3시간
import copy
# 설계 10분
# 격자크기 / 박멸 진행 년수/ 제초제 확산범위/ 제초제 남아잇는 년 수
n, m, k, c = map(int, input().split())
arr = [list(map(int, input().split())) for _ in range(n)]
def print_arr():
print("arr")
for i in range(n):
print(*arr[i])
def in_range(y, x):
if 0 <= y < n and 0 <= x < n:
return True
return False
def main():
global arr
answer = 0
remove_tree_arr = [[0 for _ in range(n)] for _ in range(n)]
for time in range(1, m + 1):
# 제초제 제거
for i in range(n):
for j in range(n):
if remove_tree_arr[i][j] == 0: continue
if time == remove_tree_arr[i][j] + c + 1:
remove_tree_arr[i][j] = 0
arr[i][j] = 0
# 성장
X = [-1, 0, 0, 1]
Y = [0, 1, -1, 0]
trees = []
for i in range(n):
for j in range(n):
# 나무라면
if arr[i][j] > 0:
trees.append((i, j))
# 주변 체크 -> 개수이기에 copy할 필요 없음
# 1. 성장
copy_arr = copy.deepcopy(arr)
for ty, tx in trees[:]:
cnt = 0
for _ in range(4):
dy = ty + Y[_]
dx = tx + X[_]
if in_range(dy, dx) and arr[dy][dx] > 0:
cnt += 1
copy_arr[ty][tx] += cnt
cnt = 0
spread_arr = []
for _ in range(4):
dy = ty + Y[_]
dx = tx + X[_]
# 빈칸에 번식 가능
if in_range(dy, dx) and arr[dy][dx] == 0:
spread_arr.append([dy, dx])
trees.append((dy, dx))
cnt += 1
if cnt != 0:
spread = copy_arr[ty][tx] // cnt
for sy, sx in spread_arr:
copy_arr[sy][sx] += spread
arr = copy_arr
print_arr()
print()
# 제초제
dX = [-1, -1, 1, 1]
dY = [-1, 1, -1, 1]
max_ = -1
max_idx = []
for ty, tx in trees[:]:
cnt = arr[ty][tx]
remove_tree = []
for _ in range(4):
for i in range(1, k + 1):
dy = dY[_] * i + ty
dx = dX[_] * i + tx
if in_range(dy, dx):
# 빈칸이면
if arr[dy][dx] == 0 or arr [dy][dx] == -2:
remove_tree.append([dy, dx])
break
# 벽이면
if arr[dy][dx] == -1:
break
else:
cnt += arr[dy][dx]
remove_tree.append([dy,dx])
if max_ < cnt:
max_ = cnt
max_idx = [[ty, tx, remove_tree]]
elif max_ == cnt:
max_idx.append([ty, tx, remove_tree])
# 제초젤 뿌릴 나무 조차 없음 -> stop
if len(max_idx) == 0: break
if len(max_idx) > 1:
max_idx.sort(key=lambda x: (x[1], x[0]))
dgy, dgx, remove_tree = max_idx[0]
answer += arr[dgy][dgx]
remove_tree_arr[dgy][dgx] = time
arr[dgy][dgx] = -2
for rty, rtx in remove_tree:
if arr[rty][rtx] != -2:
answer += arr[rty][rtx]
# 제초제 저장
remove_tree_arr[rty][rtx] = time
# 제초제 뿌림
arr[rty][rtx] = -2
print(answer)
main()