레이저 퍼즐
시간 제한2초메모리 제한512 MB
John이 거울과 크리스탈을 최대 두 번 밀어 레이저가 모든 석상을 비추게 한 뒤 문으로 나갈 수 있는지 판단합니다.
문제
탐험가 John이 위기에 처했다. 그는 크기의 직사각형 방에 갇혀 있다. 벽에 있는 레이저 발사구에서 치명적인 빔이 나오고 있어서 John은 그 빔을 가로지르거나 닿을 수 없다. 벽에는 석상과 잠긴 문도 있다. 모든 석상에 빔이 닿으면 문의 잠금이 풀린다.
방에는 기둥, 거울, 수정이 있다. 거울은 레이저를 반사한다. 거울의 각도는 수직, 수평, 대각선 중 하나다. 수정은 들어온 빔을 각도 의 두 빔으로 나눈다. 여기서 는 입사 빔의 각도다. John은 한 번에 거울이나 수정을 하나씩 밀 수 있다. 같은 거울이나 수정을 여러 번 밀 수 있다. 다만 미는 거울과 수정은 최대 두 개까지이며, 세 번째로 미는 순간 문이 영원히 잠긴다.
방은 크기의 단위 정사각형으로 이루어져 있다(그림 1). John은 상하좌우로 인접한 칸으로만 이동하며, 대각선으로는 이동하지 못한다. 기둥, 거울, 수정은 모두 칸의 중심에 놓여 있다. John이 거울이나 수정을 밀면, 그 물체는 다음 순간 옆 칸의 중심으로 옮겨간다(그림 2). 미는 과정의 상태는 따로 고려할 필요가 없다.

다음 조건이 성립한다.
- 레이저 빔의 방향은 수평, 수직, 대각선 중 하나다.
- 발사구는 인접한 칸의 중심을 향해 빔을 쏜다.
- 발사구는 벽에 있다.
- John은 기둥이 있는 칸에 들어갈 수 없다.
- 거울은 칸의 중심에서 빔을 반사하며, 양면 모두에서 반사한다.
- 빔과 평행한 거울은 빔을 막는다.
- 수정은 칸의 중심에서 빔을 나눈다.
- 대각선 빔은 석상에 닿지 않는다.
- 문에 수직, 수평, 대각선 빔 중 하나라도 닿으면 John은 방을 나갈 수 없다.
John은 거울과 수정을 알맞은 위치로 밀어 옮긴 뒤 문을 통해 방을 나가야 한다. John이 방을 나갈 수 있는지 확인하는 프로그램을 작성하라. 아래 그림 3은 초기 상태이고, 그림 4는 가능한 해 중 하나다.

입력
첫 줄에 양의 정수 와 가 주어진다(). 이어지는 개의 줄에 방의 지도가 주어지며, 사용되는 문자는 다음과 같다.
#: 방의 벽*: 기둥S: 벽에 있는 석상/: 바닥 변에서 각도를 이루는 대각선 거울\: 바닥 변에서 각도를 이루는 대각선 거울-: 수평 거울|: 수직 거울O: 수정@: John의 초기 위치.: 빈 바닥L: 레이저 발사구D: 문
출력
John이 방을 나갈 수 있으면 Yes를, 그렇지 않으면 No를 출력한다.