Posts [알고리즘] 백준 6593 - 상범 빌딩
Post
Cancel

[알고리즘] 백준 6593 - 상범 빌딩


문제

6593 - 미로 탐색


접근

2차원 BFS 문제에서 3차원으로 차원만 늘린 경우이다.

2차원일 때는 인접한 4칸을 확인했다면, 3차원일 때는 인접한 6칸을 확인하면 된다.

이 때 방문배열인 visit를 -1로 초기화하고 시작한다면 종료지점에 도달할 수 있는지 없는지에 대한 검사가 필요없어진다.

이 문제의 경우는 출력 형식이 다르기 때문에 어쩔 수 없이 확인해주어야 한다.

코드

  • 파이썬 코드
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
45
46
47
48
49
50
51
52
from collections import deque

def bfs(start, end):
    q = deque()
    q.append(start)
    sx, sy, sz = start
    visit[sz][sy][sx] = 0
    while q:
        nowx, nowy, nowz = q.popleft()
        if nowx == end[0] and nowy == end[1] and nowz == end[2]:
            return visit[nowz][nowy][nowx]
        for i, j, k in zip(dx, dy, dz):
            nx = i + nowx
            ny = j + nowy
            nz = k + nowz

            if nx < 0 or nx >=x or ny < 0 or ny >= y or nz <0 or nz >= z:
                continue
            if board[nz][ny][nx] == 1 and visit[nz][ny][nx] == -1:
                visit[nz][ny][nx] = visit[nowz][nowy][nowx]+1
                q.append([nx, ny, nz])
    return -1

dx = [1,-1,0,0,0,0]
dy = [0,0,1,-1,0,0]
dz = [0,0,0,0,1,-1]
while True:
    z, y, x = map(int, input().split(' '))
    if x+y+z == 0:
        break
    board = [[[] * (x) for _ in range(y)] for _ in range(z)]
    visit = [[[-1] * (x) for _ in range(y)] for _ in range(z)]
    start = []
    end = []
    for i in range(z):
        for j in range(y):
            tmp = input()
            for idx, item in enumerate(tmp):
                if item == '.' or item == 'S' or item == 'E':
                    if item == 'S':
                        start = [idx, j, i]
                    elif item == 'E':
                        end = [idx, j, i]
                    board[i][j].append(1)
                else:
                    board[i][j].append(0)
        input()
    ans = bfs(start, end)
    if ans == -1:
        print('Trapped!')
    else:
        print('Escaped in', ans, 'minute(s).')


This post is licensed under CC BY 4.0 by the author.