단순 다각형
시간 제한1초메모리 제한128 MB
가장 아래쪽(동률이면 가장 왼쪽) 점을 기준점으로 잡고 나머지 점들을 극각 순서로 정렬해 단순 다각형을 만드는 특정 순열을 출력하는 문제입니다.
문제
평면 위에 놓인 점들의 집합이 주어진다. 이 점들을 꼭짓점으로 하는 다각형을 만드는 프로그램을 작성하시오. 집합의 모든 점은 반드시 다각형의 꼭짓점이 되어야 하며, 집합에 없는 점을 꼭짓점으로 사용할 수 없다. 또한 다각형의 서로 다른 두 변은 이웃한 두 변이 공유하는 꼭짓점을 제외하고는 서로 만나거나 교차하지 않아야 한다. 즉, 단순 다각형이어야 한다.
입력으로 주어지는 점들은 항상 이러한 단순 다각형을 만들 수 있는 집합이다. 같은 위치에 있는 두 점은 없고, 모든 점이 한 직선 위에 있는 경우도 없다.
입력
첫째 줄에 테스트 케이스의 개수 ()가 주어진다. 각 테스트 케이스는 한 줄로 이루어진다. 그 줄의 첫 번째 정수는 점의 개수 ()이고, 이어서 각 점의 좌표 와 가 차례대로 주어진다. 모든 좌표는 이상 이하의 정수이다. 점에는 입력에 주어진 순서대로 부터 까지 번호를 매긴다.
출력
각 테스트 케이스마다 부터 까지의 정수를 한 번씩 사용한 순열을 공백으로 구분하여 한 줄에 출력한다. 이 순열은 점들을 잇는 순서를 나타내며, 그 순서대로 점을 이으면 단순 다각형이 되어야 한다.
가능한 단순 다각형은 여러 가지일 수 있으므로, 채점을 위해 다음 규칙으로 유일하게 정해지는 순서를 출력한다.
- 기준점을 고른다: 좌표가 가장 작은 점, 그런 점이 여럿이면 그중 좌표가 가장 작은 점을 기준점으로 한다.
- 기준점을 제외한 나머지 점들을, 기준점에서 그 점으로 향하는 벡터의 방향각을 기준으로 반시계 방향(각이 커지는 순서)으로 정렬한다.
- 방향각이 같은 점들(기준점과 한 직선 위에 있는 점들)은 기준점까지의 거리가 가까운 것부터 나열한다. 단, 방향각이 가장 큰 점들의 묶음만은 거리가 먼 것부터 나열한다.
- 기준점의 번호를 가장 먼저 출력하고, 이어서 위 순서로 정해진 나머지 점들의 번호를 출력한다.
이 규칙으로 얻은 순서는 항상 단순 다각형을 이룬다.