거울 뒤의 화면
시간 제한1초메모리 제한128 MB
정사각형 영역에서 레이저 광선이 거울에 반사되고 분할기를 통과하며 나뉘는 과정을 시뮬레이션하고, 광선을 흡수한 검출기 번호를 모두 출력한다.
문제
악마 박승원은 세계에서 가장 강력한 레이저를 찾고 있으며, 그 일을 당신에게 맡겼다. 당신에게는 레이저 시제품이 있지만, 제작 예산을 받으려면 먼저 시뮬레이션 결과를 박승원에게 보여 주어야 한다.
시뮬레이션은 2차원 평면 위에 "거울", "광선 스플리터", "광선 감지기"를 배치하면서 시작한다. 각 물체는 하나의 선분으로 표현된다.
- 거울(M): 광선이 거울에 닿으면 거울 선분에 대해 반사되어 진행한다.
- 감지기(D): 들어오는 광선을 흡수한다.
- 스플리터(S): 들어오는 광선을 두 개로 나눈다. 하나는 스플리터를 그대로 통과하여 방향이 바뀌지 않고, 다른 하나는 스플리터 선분에 대해 반사되어 진행한다.
시작점과 방향이 주어진 레이저를 발사했을 때, 어떤 감지기들이 광선을 흡수하는지 구하라. 문제를 단순화하기 위해 다음을 가정한다.
- 시뮬레이션은 한 변의 길이가 인 정사각형 구역만 다루면 되며, 모든 물체는 이 구역 안에 있다.
- 주어지는 선분들은 서로 겹치거나 만나지 않는다.
- 레이저는 정사각형 구역의 가장자리에서 발사된다.
- 모든 광선이 구역 밖으로 빠져나가거나 감지기에 흡수되면 시뮬레이션이 끝난다.
- 시뮬레이션 전체에서 레이저 광선의 반사 횟수는 번 미만이다.
- 감지기는 최소 개 존재한다.
- 시뮬레이션 도중 레이저 광선이 어떤 물체와 한 직선 위에 놓이는 경우는 없다.
입력
첫째 줄에 테스트 케이스의 수 이 주어진다. 각 테스트 케이스는 다음과 같이 구성된다.
- 첫째 줄에 "x,y i,j" 형식으로 레이저의 시작점 와 방향 벡터 가 주어진다. 시작점은 구역 가장자리 위의 한 점이다. 모든 수는 정수이며 이다.
- 둘째 줄에 물체의 수 가 주어진다.
- 이어지는 개의 줄에 물체가 하나씩 주어진다. 각 줄은 물체의 종류를 나타내는 문자로 시작하며, "M"은 거울, "S"는 스플리터, "D"는 감지기를 뜻한다. 그 뒤에 선분의 두 끝점이 각각 "x,y" 형식으로 주어진다.
- 물체는 입력에 등장한 순서대로 번부터 번까지 번호가 매겨진다.
출력
각 테스트 케이스마다 먼저 "DATA SET #k"를 출력한다. 여기서 는 테스트 케이스 번호(부터 시작)이다.
광선을 흡수한 감지기가 하나도 없으면 "NO BEAMS DETECTED"를 출력한다.
그렇지 않으면, 광선을 흡수한 감지기의 번호(입력에서의 물체 번호)를 오름차순으로 한 줄에 하나씩 출력한다. 같은 감지기가 여러 광선을 흡수하더라도 번호는 한 번만 출력한다.
힌트
Enigma - The Screen Behind The Mirror