[白俊]3055:脱出
質問する
https://www.acmicpc.net/problem/3055
に答える
# 물 먼저
import sys
from collections import deque
r,c=map(int,input().split())
maps=[list(p for p in sys.stdin.readline().strip()) for _ in range(r)]
visit=[[0]*c for _ in range(r)]
dr=[1,0,-1,0]
dc=[0,-1,0,1]
queue=deque()
#물,고슴도치 위치 queue에 담기 (고슴도치 - 물)
#굴의 위치는 target에 저장
for i in range(r):
for j in range(c):
if maps[i][j]=='*': # 물 위치
queue.append([i,j])
elif maps[i][j]=='S': # 고슴도치 위치
queue.appendleft([i,j])
elif maps[i][j]=='D': # 비버의 굴 ( 도착지 )
target_r=i
target_c=j
flag=False
#물과 고슴도치 위치에서 BFS탐색
while queue:
# 굴에 도착하고 나면 while문 탈출
# flag가 True가 되면 break
if flag:
break
# 고슴도치 위치 -> 물의 위치
pr, pc = queue.popleft()
for i in range(4):
nr,nc=pr+dr[i],pc+dc[i]
if nr<0 or nr>=r or nc<0 or nc>=c:
continue
#물
if maps[pr][pc]=='*':
if maps[nr][nc]=='.' or maps[nr][nc]=='S': # 물이 빈 공간과 고슴도치를 만나면
maps[nr][nc]='*' # 물로 변경시킨다.
queue.append([nr,nc]) # 새로운 물의 좌표를 queue에 넣어줌
#고슴도치
elif maps[pr][pc] == 'S': # 고슴도치라면
if maps[nr][nc] == '.': # 빈 공간을 만나면 이동한다.
maps[nr][nc] = 'S' # 이동하고 S라는 흔적을 남겨둠
visit[nr][nc] = visit[pr][pc] + 1 # 해당 장소에 몇 번째(몇 분)에 도착했는지 기록한다.
queue.append([nr,nc]) # 그 장소가 최적의 시간이 아니라면 물에 잡아먹힐 것.
#굴에 도착하면 탈출
elif maps[nr][nc] == 'D': # 만약 굴에 도착했다면 (움직이려는 위치가 굴이면)
flag=True
visit[nr][nc]=visit[pr][pc]+1 # 전 방문 수 + 1 을 기록하고 while문을 빠져나온다.
break
#굴에 도착하지 못하면 visit[굴]이 0이므로
if visit[target_r][target_c]==0:
print('KAKTUS')
else: print(visit[target_r][target_c])
Reference
この問題について([白俊]3055:脱出), 我々は、より多くの情報をここで見つけました https://velog.io/@letsbebrave/백준-3055-탈출テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol