https://www.acmicpc.net/problem/6087
6087번: 레이저 통신
크기가 1×1인 정사각형으로 나누어진 W×H 크기의 지도가 있다. 지도의 각 칸은 빈 칸이거나 벽이며, 두 칸은 'C'로 표시되어 있는 칸이다. 'C'로 표시되어 있는 두 칸을 레이저로 통신하기 위해서
www.acmicpc.net
이 문제의 입력은
무조건 C와 C가 서로 연결되는 구조라는 가정이 있습니다.
이 문제는 거울을 어떻게 넣어줄건지 생각하면 되는 문제입니다.
다익스트라로 풀 수 있는데
한가지 주의할 포인트가 있습니다.
(.은 0
*은 1
출발점은 f
도착점은 e)
이 그림의 □의 경우에는
여러 방향에서 오는 케이스가 존재합니다.
다익스트라 알고리즘을 쓰다가
이 부분을 놓쳐서 다소 해맸다가 수정했습니다.
#백준 6087번 레이저통신
from heapq import heappop,heappush
dx=[0,1,0,-1]
dy=[-1,0,1,0]
W,H=map(int,input().split())
fx=-1
fy=-1
ex=-1
ey=-1
room=[[0]*W for _ in range(H)]
mirror=[[1e9]*W for _ in range(H)]
for i in range(H):
tmp=input().rstrip()
for j in range(W):
if tmp[j]=='.':
room[i][j]=0
elif tmp[j]=='*':
room[i][j]=1
elif tmp[j]=='C':
if fx==-1 and fy==-1:
fx=i
fy=j
room[i][j]=0
else:
ex=i
ey=j
room[i][j]=2
mirror[fx][fy]=0
heap=[]
heappush(heap,[0,fx,fy,0])
heappush(heap,[0,fx,fy,1])
heappush(heap,[0,fx,fy,2])
heappush(heap,[0,fx,fy,3])
while heap:
cnt,x,y,ro=heappop(heap)
if x==ex and y==ey:
continue
if cnt>mirror[x][y]:
continue
for d in range(4):
nx=x+dx[d]
ny=y+dy[d]
if nx<0 or nx>=H or ny<0 or ny>=W:
continue
if room[nx][ny]==1:
continue
#같은 방향
if ro==d:
if mirror[nx][ny]>=cnt:
#등호를 붙인 이유:다른 방향에서 들어오는 경우를 가정
mirror[nx][ny]=cnt
heappush(heap,[cnt,nx,ny,d])
#방향 틀떄
elif (ro+1)%4==d:
if mirror[nx][ny]>=cnt+1:
#등호를 붙인 이유:다른 방향에서 들어오는 경우를 가정
mirror[nx][ny]=cnt+1
heappush(heap,[cnt+1,nx,ny,d])
#방향 틀때
elif (ro-1)%4==d:
if mirror[nx][ny]>=cnt+1:
#등호를 붙인 이유:다른 방향에서 들어오는 경우를 가정
mirror[nx][ny]=cnt+1
heappush(heap,[cnt+1,nx,ny,d])
print(mirror[ex][ey])
방향설정할 때,
90도로 회전하도록 설정해주는 것도 잊지말아주세요.
https://bingorithm.tistory.com/2
"백준 6087번-레이저 통신" 반례 모음
www.acmicpc.net/problem/6087 6087번: 레이저 통신 크기가 1×1인 정사각형으로 나누어진 W×H 크기의 지도가 있다. 지도의 각 칸은 빈 칸이거나 벽이며, 두 칸은 'C'로 표시되어 있는 칸이다. 'C'로 표시되어
bingorithm.tistory.com
여기에 수 많은 반례케이스가 있습니다.
반례를 보면서 코드의 틀린 부분을 수정해보셔도 좋습니다.
[백준 16920번] 확장게임(파이썬) (1) | 2022.08.27 |
---|---|
[백준 17090번] 미로 탈출하기(파이썬) (0) | 2022.08.27 |
[백준 3089번] 네잎클로버(파이썬) (0) | 2022.08.26 |
[백준 20926번] 얼음 미로(파이썬) (2) | 2022.08.25 |
[백준 10775번] 공항(파이썬) (2) | 2022.08.24 |
댓글 영역
Tabris4547님의
글이 좋았다면 응원을 보내주세요!
이 글이 도움이 됐다면, 응원 댓글을 써보세요. 블로거에게 지급되는 응원금은 새로운 창작의 큰 힘이 됩니다.
응원 댓글은 만 14세 이상 카카오계정 이용자라면 누구나 편하게 작성, 결제할 수 있습니다.
글 본문, 댓글 목록 등을 통해 응원한 팬과 응원 댓글, 응원금을 강조해 보여줍니다.
응원금은 앱에서는 인앱결제, 웹에서는 카카오페이 및 신용카드로 결제할 수 있습니다.