Programming/Python
[파이썬] 백준 6593번: 상범 빌딩
IN.0
2020. 5. 18. 21:40
728x90
반응형
from collections import deque
dh = [-1, 1, 0, 0, 0, 0] # 상하좌우앞뒤
dx = [0, 0, 0, 0, 1, -1]
dy = [0, 0, -1, 1, 0, 0]
def BFS(h, x, y): # h: 높이, x: 앞뒤, y: 좌우
global answer
for d in range(6):
H = h + dh[d]
X = x + dx[d]
Y = y + dy[d]
if 0 <= H < L and 0 <= X < R and 0 <= Y < C: # 범위 안에 있다면
if board[H][X][Y] == '.' and visited[H][X][Y] == 0: # 비어있는 칸이고 방문한 적이 없다면
visited[H][X][Y] = visited[h][x][y] + 1
q.append([H, X, Y])
elif board[H][X][Y] == 'E': # 출구 도착
answer = visited[h][x][y] # visited 누적 횟수를 담는다
while True:
L, R, C = map(int, input().split())
if L == R == C == 0: # 0 0 0이 들어오면 멈춤
break
board = []
visited = []
S = 0 # 시작점
for l in range(L):
flat = [] # 한 층만 볼 때
sub_v = []
for r in range(R):
sub = list(input())
if S == 0: # 아직 시작점을 못찾았으면
for c in range(C):
if sub[c] == 'S': # 값이 S이면
S = [l, r, c] # 시작점 설정
break
flat.append(sub)
sub_v.append([0]*C)
input() # 한줄 띄우는(무의미한) 인풋 처리
board.append(flat)
visited.append(sub_v)
q = deque([]) # BFS를 위해 큐 생성
q.append(S) # 시작점 추가
visited[S[0]][S[1]][S[2]] = 1 # 시작점 방문 기록
answer = 0
while q: # 방문할 지점이 남아있는 동안
target = q.popleft() # 큐에서 방문 지점을 꺼내서
BFS(target[0], target[1], target[2]) # BFS 돌림
if answer != 0: # 출구를 찾아서 answer가 바뀌었다면
break # while문 종료
if answer == 0: # 출구를 못찾았다면
print('Trapped!')
else:
print('Escaped in {} minute(s).'.format(answer))
728x90
반응형