[BaekJoon] 백준 6593번 : 상범 빌딩

Updated:

6593번 : 상범 빌딩


일반적인 BFS 에서 상, 하 이동을 추가해주면 되는 문제이다.

시작을 꼭 1층에서 하란 소리가 없기 때문에 시작을 어디서 하는지 찾고 탐색을 시작하면 된다.


import sys
from collections import deque


def BFS(arr, visit, l, n, m):
    # 4. 동, 서, 남, 북, 상, 하 이동 가능
    dirs = [[0, 0, 1], [0, 0, -1], [0, 1, 0], [0, -1, 0], [1, 0, 0], [-1, 0, 0]]
    # 5. 시작 위치 탐색
    for k in range(l):
        for i in range(n):
            for j in range(m):
                if arr[k][i][j] == 'S':
                    # 6. 층, 행, 열, 분 저장
                    queue = deque([[k, i, j, 0]])
                    visit[k][i][j] = True
                    break

    while queue:
        now_l, now_n, now_m, minutes = queue.popleft()
        if arr[now_l][now_n][now_m] == 'E':
            return minutes

        # 7. 동, 서, 남, 북, 상, 하 탐색
        for value in dirs:
            visit_l, visit_n, visit_m = now_l + value[0], now_n + value[1], now_m + value[2]
            if 0 <= visit_l < l and 0 <= visit_n < n and 0 <= visit_m < m:
                if not visit[visit_l][visit_n][visit_m] and arr[visit_l][visit_n][visit_m] != '#':
                    queue.append([visit_l, visit_n, visit_m, minutes + 1])
                visit[visit_l][visit_n][visit_m] = True


def solution(l, n, m):
    # 1. 건물 정보 입력 받기
    arr = []
    for _ in range(l):
        tmp = [list(sys.stdin.readline()) for _ in range(n + 1)]
        tmp.pop()
        arr.append(tmp)

    # 2. 방문 여부 배열 생성
    visit = []
    for _ in range(l):
        tmp = [[False for _ in range(m)] for _ in range(n)]
        visit.append(tmp)

    # 3. 건물 탐색
    result = BFS(arr, visit, l, n, m)
    if result:
        print(f"Escaped in {result} minute(s).")
    else:
        print("Trapped!")


if __name__ == "__main__":
    while True:
        L, N, M = map(int, sys.stdin.readline().rsplit())
        if L + N + M == 0:
            break

        solution(L, N, M)



Categories:

Updated:

Leave a comment