말뚝 좌표 복원

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

요약
번호가 붙은 말뚝들을 잇는 삼각형의 변 길이 제곱이 반시계 순서로 주어질 때, 처음 세 말뚝의 좌표를 기준으로 나머지 모든 말뚝의 정수 좌표를 복원한다.
난이도

어려움10점 중 8점

유형
그래프, 기하, BFS, 구현
정답자
아직 제출이 없습니다

문제

새 수학관을 지을 잔디밭에 말뚝들이 박혀 있고, 이 말뚝들의 좌표를 복원하려고 한다.

측량 결과, 처음 세 말뚝은 직각을 낀 두 변의 길이가 각각 11미터이고 빗변의 길이가 2\sqrt{2}미터인 직각삼각형을 이룬다. 이 세 말뚝을 각각 좌표 (0,0)(0,0), (0,1)(0,1), (1,0)(1,0)에 놓는다. 즉 11번, 22번, 33번 말뚝은 각각 (0,0)(0,0), (0,1)(0,1), (1,0)(1,0)에 있다. 나머지 말뚝들도 모두 격자점(좌표가 정수인 점)에 정확히 놓인다.

삼각형 측량 자료가 주어질 때, 모든 말뚝의 좌표를 구하라.

입력

입력은 여러 개의 테스트 케이스로 이루어진다. 각 테스트 케이스의 첫 줄에는 두 정수 nn과 mm이 주어진다. 두 값은 모두 11 이상 10001000 이하이다. nn은 뒤따르는 줄의 개수이고, mm은 말뚝의 개수이다. 말뚝은 11번부터 mm번까지 번호가 매겨지며, 모든 말뚝의 위치는 서로 다르다. 각 말뚝의 xx, yy 좌표는 −1000000-1000000 이상 10000001000000 이하이다.

이어지는 nn개의 줄에는 각각 여섯 개의 정수 aa, bb, cc, xx, yy, zz가 주어진다. aa, bb, cc는 세 말뚝의 번호이며, 항상 반시계 방향 순서로 나열된다. 즉 말뚝 aa에서 bb를 거쳐 cc로 이동하면 bb에서 왼쪽으로 돈다. xx는 말뚝 aa와 bb 사이 거리의 제곱, yy는 말뚝 bb와 cc 사이 거리의 제곱, zz는 말뚝 cc와 aa 사이 거리의 제곱이다.

모든 말뚝은 입력의 적어도 한 줄에 등장한다. 또한 임의의 두 말뚝 aa, bb에 대해, 입력의 삼각형들 중 일부가 수열 T1,T2,…,TnT_1, T_2, \ldots, T_n을 이루어, 모든 0<i<n0 < i < n에 대해 TiT_i와 Ti+1T_{i+1}이 두 개의 꼭짓점을 공유하고, aa가 T1T_1의 꼭짓점이며 bb가 TnT_n의 꼭짓점이 되도록 할 수 있다. 입력의 마지막 줄은 0 00\ 0이며, 이 두 값은 nn, mm이 아니므로 처리하지 않는다.

출력

각 테스트 케이스마다 정확히 mm개의 줄을 출력한다. 이 mm개의 줄은 11번부터 mm번까지 말뚝의 좌표를 순서대로 나타내며, 각 줄에는 해당 말뚝의 xx 좌표와 yy 좌표를 공백으로 구분해 출력한다. 각 테스트 케이스의 첫 세 줄은 항상 다음과 같다.

0 0
0 1
1 0

예제2

  1. 예제 1

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

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