종이접기 관통 구멍

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

문제

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

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

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

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

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

입력

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

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

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

다음을 가정해도 된다.

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

출력

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