주방 로봇

시간 제한3초메모리 제한256 MB

요약
로봇이 시작점에서 출발해 n개의 병을 모두 수거하여 테이블 가장자리에 버리는 최소 이동 거리를 구하는 문제로, 각 이동에 대해 최적 경계 지점을 계산한 뒤 TSP 형태로 최적화해야 합니다.
난이도

보통10점 중 7점

유형
동적 계획법, 기하, 수학
정답자
아직 제출이 없습니다

문제

로봇은 점점 널리 쓰이고 있다. 이제는 공장뿐 아니라 가정에서도 로봇을 사용한다. 한 무리의 프로그래머들이 직접 가정용 로봇을 만들기로 했다. 파티가 끝나면 탁자 위에는 빈 병이 잔뜩 남는데, 이들은 로봇이 이 빈 병들을 치우도록 프로그래밍하기로 했다.

탁자는 너비가 w, 길이가 l인 직사각형이다. 로봇은 점 (xr, yr)에서 출발하며, 병 n개가 각각 점 (xi, yi) (i = 1, 2, ..., n)에 놓여 있다. 병 하나를 수거하려면 로봇은 그 병이 있는 지점으로 이동해 병을 집은 뒤, 탁자의 경계선 위 어느 한 점으로 가져가 버려야 한다. 로봇은 한 번에 병을 하나만 들 수 있으며, 제어 프로그램을 단순하게 하기 위해 병은 오직 탁자의 경계선 위에서만 내려놓을 수 있다.

로봇과 병의 크기는 무시할 수 있을 만큼 작아 모두 점으로 취급한다. 따라서 병을 든 로봇은 다른 병이 놓인 지점을 그대로 지나갈 수 있다.

제어 프로그램의 한 부분은 이동 경로를 계획한다. 로봇이 탁자 위의 모든 병을 수거하기 위해 이동해야 하는 경로의 최소 총 길이를 구하는 프로그램을 작성하시오.

입력

첫째 줄에 탁자의 너비 w와 길이 l을 나타내는 두 정수가 주어진다 (2 ≤ w, l ≤ 1000).

둘째 줄에 병의 개수를 나타내는 정수 n이 주어진다 (1 ≤ n ≤ 18).

이어지는 n개의 줄에는 각각 i번째 병의 좌표를 나타내는 두 정수 xi와 yi가 주어진다 (0 < xi < w, 0 < yi < l). 어떤 두 병도 같은 지점에 있지 않다.

마지막 줄에는 로봇의 시작 위치를 나타내는 두 정수 xr와 yr가 주어진다 (0 < xr < w, 0 < yr < l). 로봇의 시작 위치는 어떤 병과도 겹치지 않는다.

출력

로봇 이동 경로의 최소 총 길이를 소수점 아래 정확히 6자리까지 반올림하여 한 줄에 출력한다 (예: %.6f 형식).

예제3

  1. 예제 1

    입력
    3 4
    2
    1 1
    2 3
    2 1
    
    예상 출력
    5.605551
    
  2. 예제 2

    입력
    10 10
    1
    5 5
    2 2
    
    예상 출력
    9.242641
    
  3. 예제 3

    입력
    10 10
    1
    1 5
    5 5
    
    예상 출력
    5.000000