육각형 막대

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

요약
무한 육각 격자 위에 놓인 8개 이하의 단위 막대와 막힌 칸이 주어질 때, 막대를 회전, 이동, 버리기를 통해 하나의 닫힌 정육각형으로 만드는 최소 이동 횟수를 구한다.
난이도

어려움10점 중 8점

유형
BFS, 완전 탐색, 기하, 구현
정답자
아직 제출이 없습니다

문제

무한히 뻗은 육각형 격자를 생각하자. 격자는 아래 그림처럼 배열된, 크기가 같은 정육각형 칸들로 이루어진다. 그림에는 각 칸을 가리키는 좌표계도 함께 나타나 있다. 각 칸은 비어 있거나 막혀 있다.

그림: 격자의 일부

이 격자 위에 여러 개의 막대가 놓여 있다. 각 막대의 길이는 정확히 1 육각 단위이며, 두 끝점은 서로 이웃한 두 칸의 중심에 놓인다. 목표는 막대들을 움직여 하나의 닫힌 정육각형을 만드는 것이다. 아래 그림들은 막대로 만든 닫힌 육각형의 예이다.

막대 6개로 만든 육각형막대 6개로 만든 육각형막대 12개로 만든 육각형

막대들의 처음 좌표와 막힌 칸들의 좌표가 주어진다. 한 번의 이동으로 다음 중 정확히 하나를 할 수 있다.

  • 막대 하나를 골라 버린다.
  • 막대 하나를 골라 한 끝점을 중심으로 시계 방향 또는 반시계 방향으로 60° 회전한다.
  • 막대 하나를 골라 자신의 길이 방향으로 한 칸 민다.

막대는 막힌 칸을 절대 차지할 수 없다. 다만 두 막대가 같은 칸을 동시에 차지하는 것은 허용된다.

위 상황을 보자. (1, 1)에 막힌 칸이 있고 (0, 0)에서 (1, 0)으로 가는 막대가 있다. 가능한 네 가지 이동은 아래와 같다.

(0, 0)을 중심으로 시계 방향 60° 회전(1, 0)을 중심으로 반시계 방향 60° 회전길이 방향으로 밀기길이 방향으로 밀기

모든 이동을 끝낸 뒤에는, 남은 막대들이 정확히 하나의 닫힌 정육각형을 이루어야 하며 남는 막대가 있어서는 안 된다. 즉 격자에는 어떤 양의 정수 xx에 대해 정확히 6x6x개의 막대가 있어야 하고, 그것들이 하나의 닫힌 육각형 윤곽을 이루어야 한다. 필요한 최소 이동 횟수를 구하라.

입력

첫 줄에 테스트 케이스의 수를 나타내는 정수 TT (T<50T < 50)가 주어진다. 각 테스트 케이스는 막대의 개수를 나타내는 음이 아닌 정수 SS (S<9S < 9)로 시작한다. 이어지는 SS개의 줄에는 각각 네 정수 x1 y1 x2 y2가 주어지며, 이는 (x1,y1)(x_1, y_1)에서 (x2,y2)(x_2, y_2)로 가는 막대를 뜻한다. 모든 막대의 길이는 정확히 1 육각 단위이다. 그다음 줄에는 막힌 칸의 개수를 나타내는 음이 아닌 정수 BB (B<20B < 20)가 주어지고, 이어지는 BB개의 줄에 각각 두 정수 x y로 막힌 칸 하나의 좌표가 주어진다. 막힌 칸은 어떤 막대와도 겹치지 않는다. 주어지는 모든 좌표는 [−4,4][-4, 4] 범위 안에 있다.

참고: 격자는 무한하므로, 최적해에서 완성되는 육각형은 [−4,4][-4, 4] 바깥의 칸을 사용할 수도 있다.

출력

각 테스트 케이스마다 Case i: m 형식으로 한 줄을 출력한다. 여기서 ii는 테스트 케이스 번호(1부터 시작)이고 mm은 필요한 최소 이동 횟수이다. 닫힌 육각형을 만들 수 없으면 대신 Case i: impossible을 출력한다.

예제1

  1. 예제 1

    입력
    3
    6
    -1 -1 -1 0
    -1 0 0 1
    0 1 1 1
    1 1 1 0
    1 0 0 -1
    0 -1 -1 -1
    0
    5
    -1 0 0 1
    0 1 1 1
    1 1 1 0
    1 0 0 -1
    0 -1 -1 -1
    0
    7
    -2 -2 -2 -1
    -1 -1 -1 0
    0 0 1 1
    0 0 1 1
    0 0 1 1
    1 1 2 2
    1 2 2 2
    2
    1 0
    2 0
    
    예상 출력
    Case 1: 0
    Case 2: impossible
    Case 3: 9