만드는 중입니다

아직 만드는 중이라 바뀔 수 있습니다

우주선 궤적

시간 제한2초메모리 제한512 MB

요약
3차원 공간에서 시작 위치와 방향, 목표 위치와 방향이 주어질 때, 반지름이 r0 이상인 원호와 직선을 이어 붙여 두 상태를 잇는 경로를 구합니다.
난이도

어려움10점 중 8점

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

문제

당신은 3차원 공간에서 우주선을 조종하고 있다.

우주선은 지금 점 (x1,y1,z1)(x_1, y_1, z_1)에 있고, 방향 (vx1,vy1,vz1)(v_{x1}, v_{y1}, v_{z1})으로 날고 있다. 목표는 점 (x2,y2,z2)(x_2, y_2, z_2)에 방향 (vx2,vy2,vz2)(v_{x2}, v_{y2}, v_{z2})를 유지한 채 도착하는 것이다. 우주선은 직선 또는 반지름이 r0r_0 이상인 원호를 따라서만 비행할 수 있다. 비행 구간이 바뀌는 지점(직선과 원호, 원호와 직선, 서로 다른 두 원호, 서로 다른 두 직선. 마지막 경우는 무의미하지만 포함한다)에서는 방향이 같아야 한다. 방향 벡터는 양의 상수배만큼 차이가 나도 같은 방향으로 본다. 예를 들어 (1, 1, 1)과 (2, 2, 2)는 같은 방향이지만, (1, 1, 1)과 (-1, -1, -1)은 같은 방향이 아니다.

궤적은 최단일 필요가 없다. 출력 형식에 적힌 느슨한 조건만 만족하면 어떤 궤적이든 된다.

입력

첫 줄에 정수 x1x_1, y1y_1, z1z_1 (−10≤x1,y1,z1≤10-10 \le x_1, y_1, z_1 \le 10)이 주어진다.

둘째 줄에 정수 vx1v_{x1}, vy1v_{y1}, vz1v_{z1} (−10≤vx1,vy1,vz1≤10-10 \le v_{x1}, v_{y1}, v_{z1} \le 10, 셋 중 적어도 하나는 0이 아니다)이 주어진다.

셋째 줄에 실수 x2x_2, y2y_2, z2z_2 (−10≤x2,y2,z2≤10-10 \le x_2, y_2, z_2 \le 10)이 주어진다.

넷째 줄에 실수 vx2v_{x2}, vy2v_{y2}, vz2v_{z2} (−10≤vx2,vy2,vz2≤10-10 \le v_{x2}, v_{y2}, v_{z2} \le 10, 셋 중 적어도 하나는 0이 아니다)이 주어진다.

다섯째 줄에 정수 r0r_0 (1≤r0≤101 \le r_0 \le 10)이 주어진다.

출력

첫 줄에 궤적을 이루는 구간의 개수 nn (0≤n≤1000 \le n \le 100)을 출력한다. 다음 nn개의 줄에 각 구간을 설명한다.

각 구간마다 직선이면 1, 원호이면 2를 먼저 출력하고, 그 뒤에 구간의 끝점 좌표를 실수로 출력한다. 원호인 구간은 원의 중심 좌표를 추가로 출력한다. 구간의 시작점은 이전 구간의 끝점이며, 첫 구간의 시작점은 전체 출발점이다.

출력하는 모든 좌표의 절댓값은 1000을 넘으면 안 된다. 채점 프로그램은 최소 倍정밀도 실수로 계산한다. 변곡점마다 인접한 두 구간의 방향이 이루는 각은 10−610^{-6}을 넘으면 안 된다. 끝점은 요구된 끝점과 10−610^{-6} 이내로 가까워야 한다. 시작 방향과 요구된 시작 방향이 이루는 각, 끝 방향과 요구된 끝 방향이 이루는 각도 각각 10−610^{-6}을 넘으면 안 된다. 원호 구간마다 중심에서 두 끝점까지의 거리 차이는 10−610^{-6} 이하여야 하고, 각 거리는 r0−10−6r_0 - 10^{-6} 이상이어야 한다.

아주 짧은 직선 구간은 조심해야 한다. 반올림 오차 때문에 방향이 크게 흔들려서 각도 검사에 실패할 수 있다. 길이가 0인 직선 구간은 항상 오답이다.

예제2

  1. 예제 1

    입력
    1 2 3
    0 1 0
    3 7 3
    1 0 0
    2
    
    예상 출력
    2
    1 1.0 5.0 3.0
    2 3.0 7.0 3.0 3.0 5.0 3.0
    
  2. 예제 2

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