만드는 중입니다

아직 만드는 중이라 바뀔 수 있습니다

레이저 퍼즐

시간 제한2초메모리 제한512 MB

요약
John이 거울과 크리스탈을 최대 두 번 밀어 레이저가 모든 석상을 비추게 한 뒤 문으로 나갈 수 있는지 판단합니다.
난이도

보통10점 중 6점

유형
완전 탐색, 시뮬레이션, BFS
정답자
아직 제출이 없습니다

문제

탐험가 John이 위기에 처했다. 그는 W×HW \times H 크기의 직사각형 방에 갇혀 있다. 벽에 있는 레이저 발사구에서 치명적인 빔이 나오고 있어서 John은 그 빔을 가로지르거나 닿을 수 없다. 벽에는 석상과 잠긴 문도 있다. 모든 석상에 빔이 닿으면 문의 잠금이 풀린다.

방에는 기둥, 거울, 수정이 있다. 거울은 레이저를 반사한다. 거울의 각도는 수직, 수평, 대각선 중 하나다. 수정은 들어온 빔을 각도 θ±π4\theta \pm \frac{\pi}{4}의 두 빔으로 나눈다. 여기서 θ\theta는 입사 빔의 각도다. John은 한 번에 거울이나 수정을 하나씩 밀 수 있다. 같은 거울이나 수정을 여러 번 밀 수 있다. 다만 미는 거울과 수정은 최대 두 개까지이며, 세 번째로 미는 순간 문이 영원히 잠긴다.

방은 W×HW \times H 크기의 단위 정사각형으로 이루어져 있다(그림 1). John은 상하좌우로 인접한 칸으로만 이동하며, 대각선으로는 이동하지 못한다. 기둥, 거울, 수정은 모두 칸의 중심에 놓여 있다. John이 거울이나 수정을 밀면, 그 물체는 다음 순간 옆 칸의 중심으로 옮겨간다(그림 2). 미는 과정의 상태는 따로 고려할 필요가 없다.

다음 조건이 성립한다.

  • 레이저 빔의 방향은 수평, 수직, 대각선 중 하나다.
  • 발사구는 인접한 칸의 중심을 향해 빔을 쏜다.
  • 발사구는 벽에 있다.
  • John은 기둥이 있는 칸에 들어갈 수 없다.
  • 거울은 칸의 중심에서 빔을 반사하며, 양면 모두에서 반사한다.
  • 빔과 평행한 거울은 빔을 막는다.
  • 수정은 칸의 중심에서 빔을 나눈다.
  • 대각선 빔은 석상에 닿지 않는다.
  • 문에 수직, 수평, 대각선 빔 중 하나라도 닿으면 John은 방을 나갈 수 없다.

John은 거울과 수정을 알맞은 위치로 밀어 옮긴 뒤 문을 통해 방을 나가야 한다. John이 방을 나갈 수 있는지 확인하는 프로그램을 작성하라. 아래 그림 3은 초기 상태이고, 그림 4는 가능한 해 중 하나다.

입력

첫 줄에 양의 정수 WW와 HH가 주어진다(2<W,H≤82 < W, H \le 8). 이어지는 HH개의 줄에 방의 지도가 주어지며, 사용되는 문자는 다음과 같다.

  • #: 방의 벽
  • *: 기둥
  • S: 벽에 있는 석상
  • /: 바닥 변에서 π4\frac{\pi}{4} 각도를 이루는 대각선 거울
  • \: 바닥 변에서 3π4\frac{3\pi}{4} 각도를 이루는 대각선 거울
  • -: 수평 거울
  • |: 수직 거울
  • O: 수정
  • @: John의 초기 위치
  • .: 빈 바닥
  • L: 레이저 발사구
  • D: 문

출력

John이 방을 나갈 수 있으면 Yes를, 그렇지 않으면 No를 출력한다.

예제3

  1. 예제 1

    입력
    7 8
    ##S####
    #.....#
    S.O...#
    #.*|..#
    L..*..#
    #.O*..D
    #.@...#
    #######
    
    예상 출력
    Yes
    
  2. 예제 2

    입력
    8 3
    ###L####
    S.../@.#
    ######D#
    
    예상 출력
    Yes
    
  3. 예제 3

    입력
    8 3
    ##L#####
    S..\.@.#
    ######D#
    
    예상 출력
    No