코딩 테스트/백준 강의 연습편
BFS) 6087.레이저 통신
Carnival7
2022. 6. 9. 17:33
https://www.acmicpc.net/problem/6087
6087번: 레이저 통신
크기가 1×1인 정사각형으로 나누어진 W×H 크기의 지도가 있다. 지도의 각 칸은 빈 칸이거나 벽이며, 두 칸은 'C'로 표시되어 있는 칸이다. 'C'로 표시되어 있는 두 칸을 레이저로 통신하기 위해서
www.acmicpc.net
# solution.
# BFS의 가중치를 직선의 개수로 설정한다.
# 즉, 시작점부터 해당점까지 도달하기 위해 필요한 직선의 개수를 dist 배열에 업데이트한다.
# 여기서 필요한 직선의 개수 -1 이 필요한 거울 개수의 최솟값이므로 dist 배열의 타겟 지점의 값에서 -1을 해주면 답을 구할 수 있다.
# 가중치가 다르므로, BFS 탐색을 할 때, 각 방향에서 벽을 만나거나 탐색 범위를 벗어나기 전까지의 모든 아직 탐색되지 않은 지점을 탐색하며 각 지점을 큐에 넣는다.
from collections import deque
m,n=map(int,input().split())
dx=[-1,1,0,0]
dy=[0,0,-1,1]
a=[input() for _ in range(n)]
sx,sy,ex,ey=-1,-1,-1,-1
for i in range(n):
for j in range(m):
if a[i][j]=='C':
if sx==-1:
sx,sy=i,j
else:
ex,ey=i,j
q=deque()
q.append((sx,sy))
dist=[[-1]*m for _ in range(n)]
dist[sx][sy]=0
while q:
x,y=q.popleft()
for k in range(4):
nx,ny=x+dx[k],y+dy[k]
while 0<=nx<n and 0<=ny<m:
if a[nx][ny]=='*':
break
if dist[nx][ny]==-1:
dist[nx][ny]=dist[x][y]+1
q.append((nx,ny))
nx+=dx[k]
ny+=dy[k]
print(dist[ex][ey]-1)