티스토리 뷰

728x90

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

 

6593번: 상범 빌딩

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

www.acmicpc.net

 

3차원 배열만 구현하면 나머지는 기존의 2차원 bfs 문제와 다를게 없는 평범한 BFS 문제입니다.

상범 빌딩 구조를 저장할 리스트와 이동 횟수를 저장할 visit 리스트를 선언 한 뒤, deque를 통해 bfs를 구현하면 해결할 수 있습니다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
from collections import deque
direction = [(100), (-100), (0-10), (010), (001), (00-1)]
 
 
def bfs(x, y, z):
    dq = deque()
    dq.append([x, y, z])
    visit[x][y][z] = 0
    while dq:
        x, y, z = dq.popleft()
        for dx, dy, dz in direction:
            nx, ny, nz = x + dx, y + dy, z + dz
            if 0 <= nx < L and 0 <= ny < R and 0 <= nz < C and visit[nx][ny][nz] == -1:
                if lst[nx][ny][nz] == '.':
                    dq.append([nx, ny, nz])
                    visit[nx][ny][nz] = visit[x][y][z] + 1
                elif lst[nx][ny][nz] == 'E':
                    visit[nx][ny][nz] = visit[x][y][z] + 1
                    return
 
 
while True:
    L, R, C = map(int, input().split())
    if L == 0 and R == 0 and C == 0:
        break
    lst = [[['' for _ in range(C)] for _ in range(R)] for _ in range(L)]
    visit = [[[-1 for _ in range(C)] for _ in range(R)] for _ in range(L)]
    start_x, start_y, start_z = 000
    end_x, end_y, end_z = 000
    for i in range(L):
        for j in range(R):
            tmp = input()
            for t in range(len(tmp)):
                lst[i][j][t] = tmp[t]
                if lst[i][j][t] == 'S':
                    start_x, start_y, start_z = i, j, t
                if lst[i][j][t] == 'E':
                    end_x, end_y, end_z = i, j, t
        input()
    bfs(start_x, start_y, start_z)
    if visit[end_x][end_y][end_z] != -1:
        print("Escaped in {} minute(s).".format(visit[end_x][end_y][end_z]))
    else:
        print("Trapped!")
cs

 

 

댓글