개발조아

[BOJ/백준] 6593 상범빌딩 파이썬 본문

알고리즘/백준

[BOJ/백준] 6593 상범빌딩 파이썬

개발조아 2021. 8. 22. 21:12
728x90

문제 링크 : https://www.acmicpc.net/problem/6593

 

6593번: 상범 빌딩

당신은 상범 빌딩에 갇히고 말았다. 여기서 탈출하는 가장 빠른 길은 무엇일까? 상범 빌딩은 각 변의 길이가 1인 정육면체(단위 정육면체)로 이루어져있다. 각 정육면체는 금으로 이루어져 있어

www.acmicpc.net

 

평범한 3차원 공간에서의 BFS이다.

S에서 출발하여 E까지 가는데 걸리는 최단시간을 구하는 것이다.

 

from sys import stdin
from collections import deque

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

def solv():
    while True:
        global l,r,c,board
        l,r,c = map(int, input().split())
        if l == r == c == 0:
            return

        sz=sx=sy=-1
        board = []
        for z in range(l):
            board.append([input().strip() for _ in range(r)])
            if sz == -1:
                for x in range(r):
                    for y in range(c):
                        if board[z][x][y] == 'S':
                            sz,sx,sy = z,x,y
                            break
                    if sz != -1:
                        break
            input()
        answer = bfs(sz,sx,sy)
        if answer >= 0:
            print('Escaped in %d minute(s).'%(answer))
        else:
            print('Trapped!')

def bfs(sz,sx,sy):
    visited = [[[False]*c for _ in range(r)]for _ in range(l)]

    visited[sz][sx][sy] = True
    q = deque([(sz,sx,sy,0)])

    while q:
        z,x,y,cnt = q.pop()

        if board[z][x][y] == 'E':
            return cnt
        for d in range(6):
            nz = z + dz[d]
            nx = x + dx[d]
            ny = y + dy[d]

            if point_validator(nz,nx,ny,visited):

                visited[nz][nx][ny] = True
                q.appendleft((nz,nx,ny,cnt+1))
    return -1
def point_validator(z,x,y,visited):
    if z < 0 or x < 0 or y < 0 or z >= l or x >= r or y >= c:
        return False
    elif board[z][x][y] == '#':
        return False
    elif visited[z][x][y]:
        return False
    return True

solv()
Comments