바닥 위의 숫자

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

요약
평면 위 막대들의 연결 관계와 직각의 부호를 이용해 그래프를 구성하고, 더 큰 모양에 포함된 부분 도형은 무시하면서 세그먼트 숫자 모양 0부터 9까지 각각 몇 번 나타나는지 세는 문제입니다.
난이도

어려움10점 중 8점

유형
그래프, 기하, 구현, DFS
정답자
아직 제출이 없습니다

문제

타로는 바닥에 곧은 막대를 놓아 하나코에게 숫자를 전달한다. 각 숫자는 7세그먼트 표시기 모양으로 그려진, 정해진 열 가지 형태 중 하나로 만든다.

타로가 항상 딱 맞는 길이의 막대를 가지고 있는 것은 아니어서, 형태를 언제나 완벽하게 놓을 수 있는 것은 아니다. 다행히 하나코는 막대들 사이의 연결 관계만 유지되면 그 형태를 숫자로 인식한다. 막대의 길이나 형태 전체의 방향은 상관없고, 오직 막대들이 어떻게 연결되어 있는지만이 중요하다. 그래서 늘어나거나 회전된 형태도 숫자로 읽을 수 있지만, 어떤 숫자와도 연결 관계가 일치하지 않는 형태는 인식하지 못한다.

한 막대가 다른 막대에 닿을 때, 닿는 점은 적어도 한쪽 막대의 끝점이며, 두 막대는 정확히 한 점에서만 겹친다. 막대끼리 교차하지는 않으며, 닿는 두 막대는 항상 직각으로 만난다. 연결 관계만 유지된다면 형태의 위치, 길이, 전체 회전은 자유롭게 바뀔 수 있다. 연결 관계를 유지한다는 것은 다음을 뜻한다.

  • 떨어져 있던 막대를 서로 닿게 만들지 않는다.
  • 닿아 있던 막대를 떼어 놓지 않는다.
  • 한 막대의 끝점이 다른 막대에 닿아 있으면 그 끝점은 계속 같은 막대에 닿아 있다. 상대 막대의 내부 점에 닿아 있으면 계속 같은 막대의 같은 쪽 내부 점에 닿아 있다.
  • 닿는 두 막대가 이루는 직각의 방향(부호)은 유지된다. +90°+90° 모서리와 −90°-90° 모서리는 서로 다른 것으로 보므로, 2와 5의 형태는 구별된다.

열 개의 형태는 원본 그림에 제시된 것과 같다. 말로 설명하면, 각 숫자는 다음과 같이 곧은 막대들로 이루어진다(위·아래·왼쪽·오른쪽·가운데는 7세그먼트 표시기의 획을 가리킨다).

  • 0 — 직사각형을 이루는 막대 네 개: 위쪽 막대, 아래쪽 막대, 높이 전체의 왼쪽 막대, 높이 전체의 오른쪽 막대.
  • 1 — 세로 막대 하나(오른쪽 변).
  • 2 — 지그재그로 놓인 막대 다섯 개: 위쪽 막대, 이어서 오른쪽 위로 내려가는 막대, 왼쪽으로 가는 가운데 막대, 왼쪽 아래로 내려가는 막대, 오른쪽으로 가는 아래쪽 막대.
  • 3 — 막대 네 개: 위쪽 막대, 높이 전체의 오른쪽 막대, 아래쪽 막대, 그리고 오른쪽 막대의 내부 점에 닿는 가운데 막대.
  • 4 — 막대 세 개: 왼쪽 위 세로 막대, 높이 전체의 오른쪽 막대, 그리고 한쪽 끝이 왼쪽 위 막대와 만나고 다른 쪽 끝이 오른쪽 막대의 내부 점에 닿는 가운데 막대.
  • 5 — 2의 거울상이며 역시 막대 다섯 개: 위쪽 막대, 이어서 왼쪽 위로 내려가는 막대, 오른쪽으로 가는 가운데 막대, 오른쪽 아래로 내려가는 막대, 왼쪽으로 가는 아래쪽 막대.
  • 6 — 막대 다섯 개: 위쪽 막대, 높이 전체의 왼쪽 막대, 아래쪽 막대, 오른쪽 아래 세로 막대, 그리고 왼쪽 막대의 내부 점에 닿는 가운데 막대.
  • 7 — 막대 세 개: 위쪽 막대, 그 왼쪽 끝에서 짧게 아래로 내려오는 세로 획, 높이 전체의 오른쪽 막대.
  • 8 — 막대 다섯 개: 직사각형의 네 변에, 왼쪽 막대와 오른쪽 막대의 내부 점에 각각 닿는 가운데 막대를 더한 것.
  • 9 — 막대 네 개: 위쪽 막대, 왼쪽 위 세로 막대, 높이 전체의 오른쪽 막대, 그리고 오른쪽 막대의 내부 점에 닿는 가운데 막대.

어떤 숫자의 형태는 항상 다른 숫자의 형태를 포함한다. 예를 들어 9의 형태는 항상 1의 형태 네 개, 4의 형태 한 개, 그리고 겹쳐진 7의 형태 두 개를 포함한다. 더 큰 형태 안에 포함된 형태는 무시하고, 서로 연결된 막대들의 극대 집합이 이루는 가장 큰 형태만 센다. 9 하나는 9 한 개로 세고, 1·4·7의 개수에는 전혀 더하지 않는다.

바닥에 각 숫자가 몇 번 나타나는지 세는 것이 문제이다.

입력

입력은 여러 개의 데이터셋으로 이루어진다. 각 데이터셋의 형식은 다음과 같다.

n
xa_1 ya_1 xb_1 yb_1
xa_2 ya_2 xb_2 yb_2
.
.
.
xa_n ya_n xb_n yb_n

첫 번째 줄에는 막대의 개수 nn이 주어진다. 이어지는 nn개의 줄은 각각 막대 하나를 하나의 공백으로 구분된 네 정수 xaxa, yaya, xbxb, ybyb로 나타낸다. (xa,ya)(xa, ya)와 (xb,yb)(xb, yb)는 고정된 직교 좌표계에서 주어지는 막대의 두 끝점 좌표이다. 1≤n≤10001 \le n \le 1000, 0≤xa,ya,xb,yb≤10000 \le xa, ya, xb, yb \le 1000임을 가정해도 된다.

입력의 끝은 00 하나만 있는 줄로 표시된다.

다음도 가정해도 된다.

  • 한 점을 세 개 이상의 막대가 공유하지 않는다.
  • 모든 막대는 어떤 숫자의 일부이며, 숫자가 아닌 형태는 바닥에 없다.
  • 한 숫자의 막대는 다른 숫자의 막대와 닿거나 교차하지 않는다.
  • 길이가 0인 막대는 없다.

출력

각 데이터셋마다 하나의 공백으로 구분된 정수 열 개를 한 줄에 출력한다. 이 정수들은 바닥에 숫자 0,1,2,…,90, 1, 2, \ldots, 9가 각각 몇 번 나타나는지를 순서대로 나타낸다. 그 밖의 문자는 출력하지 않는다.

예제1

  1. 예제 1

    입력
    9
    60 140 200 300
    300 105 330 135
    330 135 250 215
    240 205 250 215
    298 167 285 154
    30 40 30 90
    30 90 150 90
    150 90 150 20
    30 40 150 40
    8
    320 20 300 60
    320 20 380 50
    380 50 240 330
    10 50 40 20
    10 50 110 150
    110 150 180 80
    40 20 37 17
    37 17 27 27
    20
    72 222 132 182
    204 154 204 54
    510 410 520 370
    404 54 204 54
    530 450 410 450
    204 68 404 68
    80 110 120 30
    130 160 180 60
    520 370 320 320
    310 360 320 320
    120 30 180 60
    60 100 80 110
    404 154 204 154
    80 60 60 100
    430 550 590 550
    510 410 310 360
    430 450 430 550
    404 54 404 154
    232 202 142 262
    142 262 102 202
    0
    
    예상 출력
    0 1 0 1 0 0 0 0 0 1
    0 0 0 0 0 1 0 1 0 0
    1 0 1 0 2 0 0 0 1 0