조이의 레이저 보안 시스템
시간 제한5초메모리 제한512 MB
빈 칸마다 빔이 지나가고 발사기가 파괴되지 않도록 발사기들을 90도 회전시킬지 정하고, 사전순으로 가장 작은 격자를 출력한다.
문제
조이는 긴 휴가를 떠나기 전에 적외선 레이저를 쓰는 보안 시스템을 설치했다. 기술자가 남긴 도면은 집을 행 열의 격자로 나타내고, 각 칸에는 다음 중 하나가 들어 있다.
/: 칸의 왼쪽 아래 모서리와 오른쪽 위 모서리를 잇는 양면 거울\: 칸의 왼쪽 위 모서리와 오른쪽 아래 모서리를 잇는 양면 거울-: 바로 왼쪽 칸과 바로 오른쪽 칸으로 수평 광선을 쏘는 발사기 (그런 칸이 있을 때만)|: 바로 위 칸과 바로 아래 칸으로 수직 광선을 쏘는 발사기 (그런 칸이 있을 때만)#: 벽. 집의 바깥쪽이 벽으로 둘러싸여 있다는 보장은 없다. 조이가 보안 시스템을 들인 이유 중 하나다..: 빈 칸
광선은 직선으로 나아가며 빈 칸을 그대로 지나간다. 거울에 닿으면 90도 꺾여서 계속 나아간다. 오른쪽, 위, 왼쪽, 아래로 가던 광선이 / 거울에 닿으면 차례대로 위, 오른쪽, 아래, 왼쪽으로 방향을 바꾼다. 오른쪽, 위, 왼쪽, 아래로 가던 광선이 \ 거울에 닿으면 차례대로 아래, 왼쪽, 위, 오른쪽으로 방향을 바꾼다. 광선은 벽에 닿거나 격자 밖으로 나가면 멈춘다. 광선끼리 교차해도 상관없다. 다만 광선이 발사기가 있는 칸으로 들어가면 그 발사기는 부서진다. 광선을 쏜 발사기 자신도 예외가 아니다.
조이는 빈 칸마다 광선이 적어도 하나 지나가기를 바라고, 발사기는 하나도 부서지지 않기를 바란다. 시스템은 이미 설치가 끝났으므로 조이가 할 수 있는 일은 발사기를 90도 돌리는 것뿐이다. 즉 발사기를 몇 개든 골라 (하나도 고르지 않아도 된다) -를 |로, 또는 |를 -로 바꿀 수 있다. 벽과 거울은 그대로 있고, 벽이나 거울이 있는 칸에는 광선이 지나가지 않아도 된다.
조이가 목표를 이룰 수 있는지 판정하고, 이룰 수 있으면 그때의 격자를 출력하라. 돌리는 횟수를 최소로 만들 필요는 없다.
입력
첫 줄에 테스트 케이스의 수 가 주어진다. 각 테스트 케이스의 첫 줄에는 격자의 행 수 과 열 수 가 주어지고, 이어지는 개의 줄에는 각각 문자 개가 주어진다.
제한:
- 격자의 각 문자는
/,\,-,|,#,.중 하나이다 - 한 격자의 발사기 개수, 즉
-와|의 개수를 더한 값은 1 이상 100 이하이다 - 각 격자에는
.이 적어도 하나 있다
출력
각 테스트 케이스마다 Case #x: y 형식으로 한 줄을 출력한다. 는 1부터 시작하는 테스트 케이스 번호이고, 는 조이가 목표를 이룰 수 있으면 POSSIBLE, 이룰 수 없으면 IMPOSSIBLE이다. POSSIBLE을 출력한 줄 다음에는 발사기를 돌린 뒤의 격자를 문자 개로 이루어진 개의 줄로 출력한다. 발사기가 아닌 칸은 입력의 문자를 그대로 유지하고, 발사기가 있던 칸에는 여전히 발사기가 있어야 한다.
조건을 만족하는 격자가 여러 개이면 사전순으로 가장 앞서는 것을 출력한다. 두 격자를 비교할 때는 각각 개의 줄을 순서대로 이어 붙여 문자 개짜리 문자열을 만들고 아스키 코드로 비교한다. -의 코드는 45, |의 코드는 124이므로 두 후보가 처음으로 달라지는 자리에 -가 오는 쪽이 앞선다.
힌트
발사기에서 나온 광선이 거울에 반사되어 자기 자신이 있는 칸으로 되돌아오면 그 발사기는 부서진다. 격자에 발사기가 하나뿐이어도 부서질 수 있다.
광선이 지나가야 하는 칸은 입력에서 .인 칸뿐이다. 거울이 있는 칸, 벽이 있는 칸, 발사기가 있는 칸에는 광선이 지나가지 않아도 된다.
발사기를 하나도 돌리지 않아도 되므로 입력 격자가 그대로 답이 될 수 있다.