chldkato

백준 6593 상범 빌딩 (파이썬) 본문

백준

백준 6593 상범 빌딩 (파이썬)

chldkato 2020. 2. 18. 00:55

https://www.acmicpc.net/problem/6593

 

6593번: 상범 빌딩

문제 당신은 상범 빌딩에 갇히고 말았다. 여기서 탈출하는 가장 빠른 길은 무엇일까? 상범 빌딩은 각 변의 길이가 1인 정육면체(단위 정육면체)로 이루어져있다. 각 정육면체는 금으로 이루어져 있어 지나갈 수 없거나, 비어있어서 지나갈 수 있게 되어있다. 당신은 각 칸에서 인접한 6개의 칸(동,서,남,북,상,하)으로 1분의 시간을 들여 이동할 수 있다. 즉, 대각선으로 이동하는 것은 불가능하다. 그리고 상범 빌딩의 바깥면도 모두 금으로 막혀있어 출구를 통해서

www.acmicpc.net

1. 동서남북 뿐만 아니라 상하까지 고려하여 이동 좌표를 설정한다

2. 시작 지점에서 E에 도착할 때까지 bfs를 수행한 후 조건에 맞게 출력

from collections import deque
import sys

input = sys.stdin.readline
dx = [1, -1, 0, 0, 0, 0]
dy = [0, 0, 1, -1, 0, 0]
dz = [0, 0, 0, 0, 1, -1]

def bfs(x, y, z):
    q.append([x, y, z])
    d[x][y][z] = 1
    while q:
        x, y, z = q.popleft()
        for i in range(6):
            nx = x + dx[i]
            ny = y + dy[i]
            nz = z + dz[i]
            if 0 <= nx < l and 0 <= ny < r and 0 <= nz < c:
                if a[nx][ny][nz] == 'E':
                    print("Escaped in {0} minute(s).".format(d[x][y][z]))
                    return
                if a[nx][ny][nz] == '.' and d[nx][ny][nz] == 0:
                    d[nx][ny][nz] = d[x][y][z] + 1
                    q.append([nx, ny, nz])
    print("Trapped!")

while True:
    l, r, c = map(int, input().split())
    if l == 0 and r == 0 and c == 0:
        break
    a = [[[]*c for _ in range(r)] for _ in range(l)]
    d = [[[0]*c for _ in range(r)] for _ in range(l)]
    q = deque()
    for i in range(l):
        a[i] = [list(map(str, input().strip())) for _ in range(r)]
        input()
    for i in range(l):
        for j in range(r):
            for k in range(c):
                if a[i][j][k] == 'S':
                    bfs(i, j, k)

'백준' 카테고리의 다른 글

백준 10159 저울 (파이썬)  (0) 2020.02.18
백준 2458 키 순서 (파이썬)  (1) 2020.02.18
백준 2251 물통 (파이썬)  (0) 2020.02.18
백준 9372 상근이의 여행 (파이썬)  (0) 2020.02.18
백준 5427 불 (파이썬)  (0) 2020.02.17
Comments