[핵심]
3차원 리스트를 활용하고 index를 맞게 조절해주느라 조금 헷갈렸다.
나는 기본적으로 z축을 먼저 정렬하여 [z][x][y]구조로 생각했다.
최단거리 문제는 BFS가 어울린다. 왜냐하면 동시에 카운팅을 해주어야 하니까.
*한번에 stack를 모두 처리하기 위해 while안에 포문을 한번더 설정해준것.
*초기값 모두 한번에 해결하기 위해 dfs안 while밖에 포문으로 stack에 넣어준것
이 핵심이였다. 꼭 반복 연습하자
import collections #dq를 활용
m,n,h = map(int,input().split())
total =[]
for i in range(h):
lit =[]
for j in range(n):
t = list(map(int,input().split()))
lit.append(t)
total.append(lit)
visited = [[[False for i in range(m)] for j in range(n)] for w in range(h)]
number = [[[0 for i in range(m)] for k in range(n)] for w in range(h)]
#3차원 좌표 움직임
dx =[0,0,1,-1,0,0]
dy =[1,-1,0,0,0,0]
dz =[0,0,0,0,+1,-1]
def bfs(stack,count):
cont =count
# 여러개가 동시에 늘어날떄는 while밖에서 초기값들 설정
for i in range(n):
for j in range(m):
for _ in range(h):
if total[_][i][j] == 1:
stack.append([i,j,_])
while stack:
cont += 1
#한번 while을 돌때 모두 처리가 되야한다
for tt in range(len(stack)):
x = stack[0][0]
y = stack[0][1]
z = stack[0][2]
stack.popleft()
for i in range(6):
X = x+dx[i]
Y = y+dy[i]
Z = z+dz[i]
if 0<=X<n and 0<=Y<m and 0<=Z<h and total[Z][X][Y] == 0 and number[Z][X][Y] == 0:
number[Z][X][Y] = count
total[Z][X][Y] = 1
stack.append([X,Y,Z])
return cont
dq= collections.deque()
tem = bfs(dq,0)
no=0
# 간단하게 할 수 있을텐데..
for i in range(n):
for j in range(m):
for k in range(h):
if total[k][i][j] ==0:
no = 1
if no ==1:
print(-1)
else:
print(tem-1)
'Data Science > 알고리즘 공부' 카테고리의 다른 글
[백준][파이썬] 10974 모든 순열 (0) | 2020.04.05 |
---|---|
[백준][파이썬] 10973 이전순열 (0) | 2020.04.02 |
[백준][파이썬] 2178 미로탈출 (최단거리) (0) | 2020.03.30 |
[파이썬][백준] 2667 단지번호 붙이기 (0) | 2020.03.28 |
[백준][파이썬] 1012 유기농 배추 BFS (0) | 2020.03.26 |
댓글