(BFS) 백준 6593번 상범 빌딩

DARTZ·2022년 5월 2일
0

알고리즘

목록 보기
34/135
import sys
from collections import deque

sys.stdin = open('input.txt', 'rt')
input = sys.stdin.readline

dx = [1, -1, 0, 0, 0, 0]
dy = [0, 0, 1, -1, 0, 0]
dl = [0, 0, 0, 0, 1, -1]


def bfs(gl, column, row):
    queue.append([gl, column, row]) # q에 현재 좌표 입력!! ex)시작 일 경우 시작 좌표 입력
    visited[gl][column][row] = 1 # 방문처리를 해줍니다.
    while queue:
        gl, column, row = queue.popleft()

        # 방향입니다. 동서남북 위 아래 총 6번
        for i in range(6):
            nl = gl + dl[i]
            ny = column + dy[i]
            nx = row + dx[i]

            if 0 <= nx < r and 0 <= ny < c and 0 <= nl < l: # 범위를 벗어나지 않는 경우에만 실행합니다.
                if graph[nl][ny][nx] == 'E': # 다음 방문할 곳이 종료 지점이면!
                    # 정답을 출력합니다.
                    print("Escaped in {0} minute(s).".format(
                        visited[gl][column][row]))
                    return # 종료
                if graph[nl][ny][nx] == '.' and visited[nl][ny][nx] == 0: # 다음 방문 지점이 방문할 수 있고 ('.'일 경우) 아직 방문하지 않았을 경우
                    visited[nl][ny][nx] = visited[gl][column][row] + 1 # 경로 횟수 추가
                    queue.append([nl, ny, nx]) # 큐에 추가

    print("Trapped!")

while True:
    l, c, r = map(int, input().split()) # L, R, C 입력
    if l == 0 and r == 0 and c == 0: # 전부 1부터 시작하므로 0일 경우 종료
        break
    graph = [[[]*r for _ in range(c)] for _ in range(l)] # 그래프 입력을 받을 리스트 생성
    visited = [[[0]*r for _ in range(c)] for _ in range(l)] # 그래프 방문경로 리스트 생성
    queue = deque() # 큐 생성 bfs이므로
    for i in range(l):
        graph[i] = [list(map(str, input().strip())) for _ in range(c)] # 입력 값 리스트에 추가
        input() # 공백 -> \n

    for gl in range(l):
        for column in range(c):
            for row in range(r):
                if graph[gl][column][row] == 'S': # S면 시작!
                    bfs(gl, column, row)

문제는 어렵지 않았으나 입력받는게 어려웠다.. 입력 받는건 블로그를 참고 했다. 참고한 김에 코드를 깔끔하게 줄이거나 정리할 수 있는 것을 참고해서 수정했다. ex) 범위등

profile
사람들이 비용을 지불하고 사용할 만큼 가치를 주는 서비스를 만들고 싶습니다.

0개의 댓글