m,n,h = map(int,input().split()) #가로 세로 높이
arr = [[list(map(int,input().split())) for _ in range(n)] for i in range(h) ]
visited = [[[False]*m for _ in range(n)] for i in range(h) ]
from collections import deque
direction = [(-1,0,0),(1,0,0),(0,-1,0),(0,1,0),(0,0,-1),(0,0,1)]
dd = deque()
for i in range(h): #높이
for j in range(n): #세로
for k in range(m): #가로
if arr[i][j][k]==1:
dd.append((k,j,i))
def spread(graph):
while dd:
x,y,z = dd.popleft()
for dx,dy,dz in direction:
xx = x+dx ; yy = y+dy ; zz = z+dz
if 0<=xx<m and 0<=yy<n and 0<=zz<h and graph[zz][yy][xx] == 0:
graph[zz][yy][xx] = graph[z][y][x]+1
dd.append((xx,yy,zz))
spread(arr)
maxx = 0
for ls in arr:
for l in ls:
for i in l:
if i == 0:
print(-1)
exit(0)
maxx = max(maxx,max(l))
print(maxx-1)
풀이
3차원 배열이라 x,y,z 조건을 사용하는데, 리스트(arr)는 순서가 반대로 된다는 점을 고려해야한다.
문제 풀이에서 헤맸던 부분은 1 근처에 있는 모든 값을 처리해야한다는거. 예를 들어, 입력이 아래와 같이 주어졌다고 한다. 5 3 1 0 -1 0 0 0 0 -1 0 1 1 0 0 0 1 1
1일 후에는 0 -1 0 2 2 0 -1 2 1 1 0 0 2 1 1 이렇게 바뀌어야한다.
근데 기존의 방법대로 bfs를 구현하면(dd를 함수 안에 넣으면) 0 -1 0 2 0 0 -1 2 1 1 0 0 0 1 1 이렇게 밖에 안돼서 답에 오류가 생긴다.