평행사변형
시간 제한1초메모리 제한64 MB
N개의 점이 주어질 때, 한 점을 A+B-C로 옮기는 규칙을 정해진 절차에 따라 적용해 모든 점을 제1사분면으로 보내는 이동 열을 만들거나, 모든 점이 한 직선 위에 있으면 불가능을 판정하는 문제다.
문제
최근 "평행사변형"이라는 컴퓨터 게임이 인기를 끌고 있다. 게임을 시작하면 컴퓨터가 화면에 점 개를 그린다. 각 점의 좌표는 이상 이하의 정수이다.
게임에서 할 수 있는 동작은 한 가지뿐이다. 한 직선 위에 있지 않은 세 점 , , 를 고른 뒤 점 대신 점 를 그린다. 는 가 선분 를 한 대각선으로 하는 평행사변형이 되게 하는 점이다. 이런 점 는 항상 존재하고 유일하며, 좌표로 쓰면 이다.
처음에는 모든 점의 좌표가 서로 다르지만, 게임 도중에는 두 개 이상의 점이 같은 좌표에 놓여도 된다. 새로 만들어지는 점의 좌표는 절댓값이 이하여야 한다.
게임의 목표는 동작을 여러 번 해서 모든 점을 제1사분면으로 옮기는 것이다. 정확히 말하면 게임이 끝났을 때 모든 점의 두 좌표가 음이 아니어야 한다.
동작을 번 이하로 해서 모든 점을 제1사분면으로 옮기는 방법을 구하거나, 그런 방법이 없다고 판정하라. 방법은 여러 가지일 수 있으므로 이 문제에서는 출력 절에 정한 규칙이 만드는 동작만 정답으로 인정한다.
입력
첫째 줄에 점의 개수 이 주어진다. ()
다음 개 줄 중 번째 줄에는 번 점의 좌표 , 가 주어진다. () 처음에 좌표가 같은 두 점은 없다.
출력
아래에서 점의 좌표는 벡터로 다루고, 는 번 점의 현재 좌표이다.
모든 점의 두 좌표가 이미 음이 아니면 0을 출력한다. 그렇지 않고 모든 점이 한 직선 위에 있으면 어떤 동작도 할 수 없으므로 -1을 출력한다.
나머지 경우에는 첫째 줄에 동작의 수 을 출력하고, 다음 개 줄에 동작을 한 줄에 하나씩 서로 다른 세 번호 A B C로 출력한다. 이 동작은 번 점을 로 옮기고, 번 점과 번 점은 그대로 둔다. 동작은 다음 규칙을 그대로 따라 만든다.
- , 로 두고, 은 번 점과 번 점을 지나는 직선 위에 있지 않은 점 중 번호가 가장 작은 점으로 정한다.
- 세 점 , , 의 좌표와 좌표가 모두 이상이면 이 단계를 건너뛴다. 그렇지 않으면 세 점을 함께 평행이동한다.
- , , 로 둔다. 는 이면 , 이면 이다.
- , 이다. 단, 이다.
- , 로 둔다. 그러면 이고 이다.
- , 는 세 점의 좌표 중 최솟값과 좌표 중 최솟값이다. 는 를 만족하는 가장 작은 음이 아닌 정수이고, 는 를 만족하는 가장 작은 음이 아닌 정수이다.
- , 로 둔다. 이면 , 이면 , 그 밖의 경우에는 이다. , 로 둔다.
- 서로 다른 세 번호 , , 에 대해 블록 는 여섯 동작
I J K,I K J,J K I,J I K,K I J,K J I를 이 순서대로 하는 것이다. 블록 하나는 세 점을 만큼 평행이동하고, 각 번호의 점은 자기 자리의 평행이동된 위치로 간다. - 먼저 이면 블록 를 번, 그렇지 않으면 블록 를 번 한다. 다음으로 이면 블록 를 번, 그렇지 않으면 블록 를 번 한다. 마지막으로 이면 블록 를 번, 그렇지 않으면 블록 를 번 한다. 이 단계가 끝나면 세 점의 좌표는 모두 이상이다.
- , , 가 아닌 점을 번호가 작은 것부터 차례로 보면서, 좌표 중 음수가 있는 점 마다 동작
a b c를 한 번 한다. 는 , , 중 점 와 한 직선 위에 있지 않은 첫 번째 쌍이다. 옮겨진 점 의 두 좌표는 음이 아니다.
이 규칙이 만드는 동작은 항상 개 이하이고, 모든 좌표의 절댓값은 이하로 유지된다.