단순 다각형

시간 제한1초메모리 제한128 MB

요약
가장 아래쪽(동률이면 가장 왼쪽) 점을 기준점으로 잡고 나머지 점들을 극각 순서로 정렬해 단순 다각형을 만드는 특정 순열을 출력하는 문제입니다.
난이도

보통10점 중 5점

유형
기하, 정렬, 수학
정답자
아직 제출이 없습니다

문제

평면 위에 놓인 점들의 집합이 주어진다. 이 점들을 꼭짓점으로 하는 다각형을 만드는 프로그램을 작성하시오. 집합의 모든 점은 반드시 다각형의 꼭짓점이 되어야 하며, 집합에 없는 점을 꼭짓점으로 사용할 수 없다. 또한 다각형의 서로 다른 두 변은 이웃한 두 변이 공유하는 꼭짓점을 제외하고는 서로 만나거나 교차하지 않아야 한다. 즉, 단순 다각형이어야 한다.

입력으로 주어지는 점들은 항상 이러한 단순 다각형을 만들 수 있는 집합이다. 같은 위치에 있는 두 점은 없고, 모든 점이 한 직선 위에 있는 경우도 없다.

입력

첫째 줄에 테스트 케이스의 개수 cc (1≤c≤2001 \le c \le 200)가 주어진다. 각 테스트 케이스는 한 줄로 이루어진다. 그 줄의 첫 번째 정수는 점의 개수 nn (3≤n≤20003 \le n \le 2000)이고, 이어서 각 점의 좌표 xx와 yy가 차례대로 주어진다. 모든 좌표는 −10000-10000 이상 1000010000 이하의 정수이다. 점에는 입력에 주어진 순서대로 00부터 n−1n-1까지 번호를 매긴다.

출력

각 테스트 케이스마다 00부터 n−1n-1까지의 정수를 한 번씩 사용한 순열을 공백으로 구분하여 한 줄에 출력한다. 이 순열은 점들을 잇는 순서를 나타내며, 그 순서대로 점을 이으면 단순 다각형이 되어야 한다.

가능한 단순 다각형은 여러 가지일 수 있으므로, 채점을 위해 다음 규칙으로 유일하게 정해지는 순서를 출력한다.

  1. 기준점을 고른다: yy좌표가 가장 작은 점, 그런 점이 여럿이면 그중 xx좌표가 가장 작은 점을 기준점으로 한다.
  2. 기준점을 제외한 나머지 점들을, 기준점에서 그 점으로 향하는 벡터의 방향각을 기준으로 반시계 방향(각이 커지는 순서)으로 정렬한다.
  3. 방향각이 같은 점들(기준점과 한 직선 위에 있는 점들)은 기준점까지의 거리가 가까운 것부터 나열한다. 단, 방향각이 가장 큰 점들의 묶음만은 거리가 먼 것부터 나열한다.
  4. 기준점의 번호를 가장 먼저 출력하고, 이어서 위 순서로 정해진 나머지 점들의 번호를 출력한다.

이 규칙으로 얻은 순서는 항상 단순 다각형을 이룬다.

예제3

  1. 예제 1

    입력
    2
    4 0 0 2 0 0 1 1 0
    5 0 0 10 0 10 5 5 -1 0 5
    
    예상 출력
    0 3 1 2
    3 1 2 4 0
    
  2. 예제 2

    입력
    1
    3 0 0 1 0 0 1
    
    예상 출력
    0 1 2
    
  3. 예제 3

    입력
    1
    4 0 0 1 0 1 1 0 1
    
    예상 출력
    0 1 2 3