https://www.acmicpc.net/problem/6593
6593번: 상범 빌딩
당신은 상범 빌딩에 갇히고 말았다. 여기서 탈출하는 가장 빠른 길은 무엇일까? 상범 빌딩은 각 변의 길이가 1인 정육면체(단위 정육면체)로 이루어져있다. 각 정육면체는 금으로 이루어져 있어
www.acmicpc.net
- 상범 빌딩은 각 변의 길이가 1인 정육면체(단위 정육면체)로 이루어져있다.
- 각 정육면체는 금으로 이루어져 있어 지나갈 수 없거나, 비어있어서 지나갈 수 있게 되어있다.
- 당신은 각 칸에서 인접한 6개의 칸(동,서,남,북,상,하)으로 1분의 시간을 들여 이동할 수 있다.
- 즉, 대각선으로 이동하는 것은 불가능하다. 그리고 상범 빌딩의 바깥면도 모두 금으로 막혀있어 출구를 통해서만 탈출할 수 있다.
- 당신은 상범 빌딩을 탈출할 수 있을까? 만약 그렇다면 얼마나 걸릴까?
입력이 생소하게 느껴져서, board를 받는 부분부터가 쉽지 않은 문제였다.
솔직히, board를 받는 부분이 3차원이 되어서, 파이썬에서 3차원 배열을 어떻게 받는지 연습을 좀 하고왔다.
F,N,M = map(int,input().split())
building=[[[] for _ in range(N)] for _ in range(F)]
for i in range(F):
building[i]=[list(map(str,input().rstrip())) for _ in range(N)]
input()
1. Floor *N*M 의 크기로 이루어져있는 3차원 배열을 선언한 뒤,
2. 각각의 층 별로, 정보를 저장하는 방식으로 진행하였다. 1개의 층마다 2차원 배열을 갖고 있으므로,
- building의 초기 상태는, [ [[],[],[],[]] , [[],[],[],[]] , [[],[],[],[]] ] 이런 상태일거다.
- building의 1층부터, 한줄씩, N번 집어넣는 과정을 거친다.
- 그리고, 입력이 끝난 후, 공백이 한줄 들어오기 때문에, 공백도 받아준다.
이 부분만 이해가 잘되면, 논리는 똑같다. 단지, 2차원 -> 3차원이 되면서, 상대좌표도 6개가 된 문제이다.
from collections import deque
dz=(0,0,0,0,1,-1)
dx=(1,0,-1,0,0,0)
dy=(0,1,0,-1,0,0)
def is_valid_coord(z,y,x):
return 0<=z<F and 0<=y<N and 0<=x<M
def bfs(z,y,x):
dq=deque()
dq.append((z,y,x))
v_chk[z][y][x] = 1
while dq:
z,y,x=dq.popleft()
for k in range(6):
nx = x + dx[k]
ny = y + dy[k]
nz = z + dz[k]
if is_valid_coord(nz,ny,nx):
if building[nz][ny][nx] =='E':
print("Escaped in {0} minute(s).".format(v_chk[z][y][x]))
return
if building[nz][ny][nx] =='.' and v_chk[nz][ny][nx] == 0:
v_chk[nz][ny][nx] = v_chk[z][y][x] + 1
dq.append((nz,ny,nx))
print("Trapped!")
while True:
F,N,M = map(int,input().split())
if F+N+M==0 :
break
building=[[[] for _ in range(N)] for _ in range(F)]
#print(building)
v_chk=[[[0]*M for _ in range(N)] for _ in range(F)]
for i in range(F):
building[i]=[list(map(str,input().rstrip())) for _ in range(N)]
input()
#print(building)
for i in range(F):
for k in range(N):
for j in range(M):
if building[i][k][j]=='S':
bfs(i,k,j)
'알고리즘 문제(SOL)' 카테고리의 다른 글
[백준/3055/파이썬] 탈출 (0) | 2022.01.01 |
---|---|
[백준/5427/파이썬] 불 (0) | 2021.12.30 |
[백준/2468/파이썬] 안전 영역 (0) | 2021.12.29 |
[백준/10026/파이썬] 적록 색약 (0) | 2021.12.29 |
[백준/2583/파이썬] 영역 구하기 (0) | 2021.12.27 |