배틀 로얄
시간 제한2초메모리 제한512 MB
파란 원 안에서 빨간 원을 피해 두 지점을 잇는 최단 경로의 길이를 구한다.
문제
배틀 로얄 게임은 요즘 비디오 게임계의 대세이며, 그중에서도 Gamers Concealed Punching Circles (GCPC)가 가장 인기 있는 게임이다. 이 게임은 단순화하면 2차원 평면으로 생각할 수 있는 영역에서 진행된다. 이동과 위치 선정은 게임플레이의 상당 부분을 차지하지만, 원하는 위치에 도달하는 것은 위험할 수 있다. 다른 플레이어들을 상대할 자신은 있지만, 목적지로 걸어가는 동안 게임 자체가 만드는 두 가지 위험이 있다.
- 게임 구역은 파란 원으로 둘러싸여 있다. 이 원 바깥에는 치명적인 역장이 있어 순식간에 게임에서 탈락하게 된다.
- 게임 구역 안에는 포격에 노출되는 빨간 원이 있다. 이 원도 들어가기에 너무 위험하다.
지도 위의 한 지점에서 다른 지점으로 이동하려고 하지만, 목적지로 가는 직선 경로가 빨간 원에 막혀 있어 우회해야 한다. 파란 원을 벗어나지 않고 빨간 원에 들어가지 않으면서 모든 위험을 피하는 최단 경로를 찾을 수 있는가? 원의 경계에 닿는 것은 괜찮다. 경계를 넘지만 않으면 된다.
입력
입력은 다음과 같다.
- 현재 위치를 나타내는 두 정수 xc, yc가 주어지는 한 줄;
- 목적지를 나타내는 두 정수 xd, yd가 주어지는 한 줄;
- 파란 원의 중심과 반지름을 나타내는 세 정수 xb, yb, rb가 주어지는 한 줄;
- 빨간 원의 중심과 반지름을 나타내는 세 정수 xr, yr, rr이 주어지는 한 줄.
모든 좌표의 절댓값은 1 000 이하이고, 1 ≤ rb, rr ≤ 1 000이다. 빨간 원은 파란 원 안에 완전히 포함된다. 현재 위치와 목적지는 파란 원 안에 완전히 포함되고 빨간 원 바깥에 완전히 있으며, 두 지점을 잇는 직선 경로는 빨간 원에 막혀 있다.
출력
파란 원을 벗어나지 않고 빨간 원에 들어가지 않으면서 이동할 수 있는 최단 경로의 길이를 출력한다. 출력값은 상대 오차 또는 절대 오차(둘 중 더 작은 값) 기준으로 10−7 이하여야 한다.