종이접기 관통 구멍

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

요약
종이 접기를 여러 겹의 세그먼트와 뒤집기 전파 규칙으로 시뮬레이션한 뒤, 핀이 뚫는 층 수를 구하는 문제입니다.
난이도

어려움10점 중 9점

유형
기하, 시뮬레이션, 구현
정답자
아직 제출이 없습니다

문제

평평한 정사각형 종이를 접은 뒤 접힌 더미에 핀을 하나 관통시켜, 종이를 다시 펼쳤을 때 원래 종이에 생기는 구멍의 개수를 구하는 시뮬레이션을 해야 한다.

접기 명령들의 나열과 그 뒤에 핀 구멍 위치 하나가 주어진다. 하나의 접기 명령은 두 점 PP와 QQ의 쌍이다. 종이는 PP가 위에서 QQ에 닿도록 접는다. 즉 선분 PQPQ의 수직이등분선인 접는 선을 따라 종이에 자국을 내고, PP 쪽에 있는 부분을 반대쪽으로 뒤집는다. 종이의 두께는 무시한다.

접힌 종이는 여러 개의 평평한 종이 조각들이 곧은 경첩(접힌 자국)으로 이어진 더미이다. 각 접기는 일부 조각을 접는 선을 따라 더 작은 조각으로 나누고 그중 일부를 뒤집는다. 접는 선을 가로지르는 조각은 둘로 나뉘어 그중 한 조각이 뒤집히고, 접는 선을 가로지르지 않는 조각은 통째로 뒤집히거나 그대로 남는다. 어떤 조각을 뒤집을지는 더 이상 뒤집을 조각이 없을 때까지 다음 규칙을 반복 적용하여 정한다.

  • 규칙 1. PP를 포함하는 가장 위쪽 조각은 반드시 뒤집힌다.
  • 규칙 2. 어떤 조각을 뒤집을 때 그 조각의 경첩 중 하나가 접는 선의 반대쪽으로 옮겨지면, 그 경첩을 공유하는 모든 조각도 뒤집혀야 한다.
  • 규칙 3. 두 조각이 겹쳐 있고 아래쪽 조각이 뒤집히면, 위쪽 조각도 함께 뒤집혀야 한다.

조각이 뒤집힐 때 그 조각은 접는 선을 기준으로 반사된다. 모든 접기 명령을 수행한 뒤, 핀 구멍 위치에서 핀이 모든 종이 층을 관통하므로 그 위치를 덮는 각 층에 구멍이 하나씩 생긴다. 종이를 펼쳤을 때 생기는 구멍의 개수(즉 최종 접힌 더미에서 핀 구멍 위치를 덮는 종이 층의 개수)를 구하라.

입력

입력은 여러 개의 데이터셋으로 이루어진다. 입력의 끝은 0 하나만 있는 줄로 표시된다. 각 데이터셋의 형식은 다음과 같다.

k
px1 py1 qx1 qy1
...
pxk pyk qxk qyk
hx hy

모든 데이터셋에서 처음 종이는 한 변이 100 mm인 정사각형이며, mm를 단위로 할 때 네 꼭짓점은 (0,0)(0,0), (100,0)(100,0), (100,100)(100,100), (0,100)(0,100)에 있다. 정수 kk는 접기 명령의 개수이며 1≤k≤101 \le k \le 10이다. 이어지는 kk개의 각 줄에는 공백으로 구분된 네 정수 pxipx_i, pyipy_i, qxiqx_i, qyiqy_i가 있어 ii번째 명령의 두 점 P=(pxi,pyi)P = (px_i, py_i)와 Q=(qxi,qyi)Q = (qx_i, qy_i)를 준다. P≠QP \ne Q라고 가정해도 된다. 명령은 주어진 순서대로 수행해야 한다. 마지막 줄에는 두 정수 hxhx, hyhy가 있어 핀 구멍의 위치 (hx,hy)(hx, hy)를 나타낸다.

다음을 가정해도 된다.

  • 각 접기 시점에 PP와 QQ는 어떤 종이 조각들 위에 있으며, PP는 종이 조각들의 모든 경계에서 최소 0.01 mm 떨어져 있다.
  • 핀을 꽂는 시점에 핀 구멍은 종이 조각들의 모든 경계에서 최소 0.01 mm 떨어져 있다.
  • 모든 접는 선은 양방향으로 무한히 연장했을 때, 그 접기 직전에 존재하는 종이 조각들의 모든 꼭짓점에서 최소 0.01 mm 떨어져 있다.
  • 두 종이 조각이 겹칠 때 그 겹치는 영역은 0.01 mm 간격의 두 평행선 사이에 들어갈 수 없으며, 두 종이 조각이 겹치지 않을 때는 한 조각의 모든 점이 다른 조각의 모든 점에서 최소 0.01 mm 떨어져 있다.

출력

각 데이터셋에 대해 펼친 종이에 생기는 핀 구멍의 개수를 한 줄에 출력한다. 출력에는 다른 어떤 문자도 나타나서는 안 된다.

예제1

  1. 예제 1

    입력
    2
    90 90 80 20
    80 20 75 50
    50 35
    2
    90 90 80 20
    75 50 80 20
    55 20
    3
    5 90 15 70
    95 90 85 75
    20 67 20 73
    20 75
    3
    5 90 15 70
    5 10 15 55
    20 67 20 73
    75 80
    8
    1 48 1 50
    10 73 10 75
    31 87 31 89
    91 94 91 96
    63 97 62 96
    63 80 61 82
    39 97 41 95
    62 89 62 90
    41 93
    5
    2 1 1 1
    -95 1 -96 1
    -190 1 -191 1
    -283 1 -284 1
    -373 1 -374 1
    -450 1
    2
    77 17 89 8
    103 13 85 10
    53 36
    0
    
    예상 출력
    3
    4
    3
    2
    32
    1
    0