# 5653. 줄기세포 배양
# 줄기세포 배양 함수
def Cultivation(G, k, t):
# 상하좌우
dr = [-1, 1, 0, 0]
dc = [0, 0, -1, 1]
# 배양 시간
h = 0
# K시간 동안 배양합니다.
while h < k:
# 갱신용 그리드
temp_G = [[(0,0,0) for _ in range(351)] for _ in range(351)]
for r in range(351):
for c in range(351):
# 줄기 세포 존재여부 조사
if G[r][c] != (0,0,0):
life, in_act_time, act_time = G[r][c]
# 죽은 세포일 때, 자리를 차지한다.
if in_act_time == act_time and in_act_time != 0 and act_time != 0:
temp_G[r][c] = (life, in_act_time, act_time)
# 활성화 되어 살아있는 세포일 때, 활성화 시간 1 추가
elif life == in_act_time and act_time < life:
# 번식
if act_time == 0:
for p in range(4):
move_r, move_c = r + dr[p], c + dc[p]
# 이미 줄기세포가 있으면 번식하지 못한다.
if G[move_r][move_c] != (0,0,0):
continue
else:
life_2, in_act_time_2, act_time_2 = temp_G[move_r][move_c]
# 갱신
if life > life_2:
temp_G[move_r][move_c] = (life, 0, 0)
temp_G[r][c] = (life, in_act_time, act_time + 1)
# 비활성화 된 세포일 때
elif in_act_time < life:
temp_G[r][c] = (life, in_act_time + 1, act_time)
# 갱신
G = []
for p in range(351):
G.append(temp_G[p])
# 시간 갱신
h += 1
# 죽은 줄기세포를 제외하고 개수를 세어준다.
cell_cnt = 0
for r in range(351):
for c in range(351):
# 줄기세포가 존재할 때
if G[r][c] != (0,0,0):
life, in_act_time, act_time = G[r][c]
if in_act_time > 0 and act_time > 0 and in_act_time == act_time:
continue
else:
cell_cnt += 1
# 답안 출력 (K시간 배양 후 배양 용기에 살아있는 줄기 세포 개수)
print("#{} {}".format(t, cell_cnt))
# 테스트 케이스 T
T = int(input())
# 각 테스트 케이스가 주어진다.
for t in range(1, T+1):
# 세로 N, 가로 M, 배양 시간 K
N, M, K = map(int, input().split())
# 그리드
grid = [[(0,0,0) for _ in range(351)] for _ in range(351)]
# 줄기세포 초기 위치
init = []
# 줄기세포 초기 위치 정보가 주어진다.
for _ in range(N):
init.append(list(map(int, input().split())))
# 격자 확장
for r in range(N):
for c in range(M):
if init[r][c]:
# (생명력, 비활성 시간, 활성 시간)
grid[r+150][c+150] = (init[r][c], 0, 0)
# 함수 실행
Cultivation(grid, K, t)
문제풀이를 위한 리스트 사용방식에 주의할 것, 리스트 안에 리스트를 선언하는 방식은 메모리, 시간 측면에서 비효율적일 수 있음.