# 2382 미생물 격리
from copy import deepcopy
# 함수
def isolation(n, m, t, G):
# 4방향, 상하좌우(1234)
dr = [-1, 1, 0, 0]
dc = [0, 0, -1, 1]
# 군집 들의 이동, m시간동안 지속
for _ in range(m):
temp_G = [[[] for _ in range(n)] for _ in range(n)]
for r in range(n):
for c in range(n):
if G[r][c]:
# [i,j]에 위치한 미생물을 모두 처리
for microbe in G[r][c]:
# 미생물 수, 이동방향
microbe_N, moving_dir = microbe
# 이동좌표
move_r, move_c = r + dr[moving_dir-1], c + dc[moving_dir-1]
# 이동좌표가 약품이 칠해진 셀에 도착할 때
if (move_r in [0, n-1]) or (move_c in [0, n-1]):
# 소수점 이하는 버린다.(2로 나눈 몫만 취한다.)
microbe_N = microbe_N // 2
# 미생물 수가 0이 되면 군집이 사라진다.
if microbe_N == 0:
continue
else:
# 기존방향 상에서 새로운방향 하
if moving_dir == 1:
temp_G[move_r][move_c].append((microbe_N, 2))
# 기존방향 하에서 새로운방향 상
elif moving_dir == 2:
temp_G[move_r][move_c].append((microbe_N, 1))
# 기존방향 좌에서 새로운방향 우
elif moving_dir == 3:
temp_G[move_r][move_c].append((microbe_N, 4))
# 기존방향 우에서 새로운방향 좌
elif moving_dir == 4:
temp_G[move_r][move_c].append((microbe_N, 3))
# 이동좌표가 일반적인 셀일 때
else:
temp_G[move_r][move_c].append((microbe_N, moving_dir))
# 군집들을 합친다.
for r in range(n):
for c in range(n):
# 한 공간에 군집이 여러개일 때
if len(temp_G[r][c]) > 1:
# 미생물 수가 많은 순서대로 정렬한다.
temp_G[r][c].sort(key = lambda x:-x[0])
new_moving_dir = temp_G[r][c][0][1]
total = 0
for microbe in temp_G[r][c]:
total += microbe[0]
temp_G[r][c].clear()
# 하나로 합친다. 방향도 갱신한다.
temp_G[r][c].append((total, new_moving_dir))
# 셀 갱신
G = []
for i in range(n):
G.append(temp_G[i])
# 남아있는 미생물의 수를 구한다.
ans = 0
for r in range(N):
for c in range(N):
if G[r][c]:
ans += G[r][c][0][0]
# 답안 출력
print("#{} {}".format(t, ans))
# 테스트 케이스 T
T = int(input())
# T개의 테스트 케이스
for t in range(1, T+1):
# 셀의 개수 N, 격리 시간 M, 미생물 군집의 개수 K가 순서대로 주어진다.
N, M, K = map(int, input().split())
# 셀 초기화
cell = [[[] for _ in range(N)] for _ in range(N)]
# K줄에 걸쳐서 미생물 군집의 정보가 주어진다.
for _ in range(K):
# 세로 위치, 가로 위치, 미생물 수, 이동 방향
R, C, microbe_N, moving_dir = list(map(int, input().split()))
# 셀에 추가 (미생물 수, 이동 방향)
cell[R][C].append((microbe_N, moving_dir))
# 함수 실행
isolation(N, M, t, cell)
리스트가 크고 복잡할 때는 deepcopy를 사용하지 말고(시간초과 주요원인), for문 + slicing 사용할 것