움직이는 물체 인식

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

요약
각 사진에서 가장 큰 흰색 연결 영역을 찾아 무게중심을 구하고, 시간에 따른 무게중심 이동으로 초당 평균 속도의 x, y 성분을 소수점 둘째 자리까지 계산한다.
난이도

보통10점 중 7점

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

문제

물체가 얼마나 빠르게 움직이는지 알아야 하는 상황은 많다. 예를 들어 공항의 관제사는 착륙하는 비행기의 속도를 알고 너무 빠르거나 느리면 경고를 보내려 하고, 속도 감지 카메라는 경찰이 과속 운전자를 잡는 데 도움을 준다.

이 문제에서는 움직이는 물체의 속도를 인식하는 프로그램을 작성한다.

물체는 2차원 평면 위를 일정한 속도와 방향으로 움직인다고 가정한다. 카메라는 1초마다 한 장씩 사진을 찍는다. 카메라는 평면의 실제 모습을 그대로 기록한다고 가정한다(시야각은 신경 쓰지 않아도 된다).

배경은 검은색이고 물체만 흰색이지만, 카메라 때문에 약간의 잡음이 섞일 수 있다. 가장 큰 연속된 흰색 영역이 항상 물체이며, 그러한 가장 큰 영역은 항상 정확히 하나만 존재한다고 가정할 수 있다.

카메라가 찍은 여러 장의 사진이 주어질 때, 물체의 속도를 계산하여 출력한다.

한 장의 사진은 . 또는 x로만 이루어진 행렬로 표현되며, .는 검은색 블록, x는 흰색 블록을 뜻한다. 사진은 항상 두 장 이상 주어진다.

정의

물체의 속도는 물체의 기하학적 중심이 움직이는 속도로 정의하며, 다음과 같다.

(∫(x,y)∈Objectx dx dy∫(x,y)∈Objectdx dy, ∫(x,y)∈Objecty dx dy∫(x,y)∈Objectdx dy)\left( \dfrac{\int_{(x,y)\in \text{Object}} x\,dx\,dy}{\int_{(x,y)\in \text{Object}} dx\,dy},\ \dfrac{\int_{(x,y)\in \text{Object}} y\,dx\,dy}{\int_{(x,y)\in \text{Object}} dx\,dy} \right)

모든 물체는 정사각형 블록으로 이루어져 있고 한 블록의 기하학적 중심은 그 블록의 중심이므로, 물체의 기하학적 중심은 다음과 같이 계산할 수 있다.

(∑i∈ObjectX[i]N, ∑i∈ObjectY[i]N)\left( \dfrac{\sum_{i \in \text{Object}} X[i]}{N},\ \dfrac{\sum_{i \in \text{Object}} Y[i]}{N} \right)

여기서 (X[i],Y[i])(X[i], Y[i])는 ii번째 블록 중심의 좌표이고, NN은 물체를 이루는 블록의 개수이다.

평균 속도는 물리 교과서에서와 같이 다음과 같이 계산한다.

AvgSpeed=∑t=0T−1pos(t+T)−pos(t)TT\text{AvgSpeed} = \dfrac{\sum_{t=0}^{T-1} \dfrac{\text{pos}(t+T) - \text{pos}(t)}{T}}{T}

여기서 tt는 00부터 T−1T-1까지의 관측 시각을 훑는다. TT는 관측 지점 개수의 절반이며(관측 지점의 개수는 항상 짝수이다), pos(t)\text{pos}(t)는 시각 tt에서 관측된 물체 중심의 위치, 즉 tt번째 사진에서 계산한 기하학적 중심이다.

그 밖의 정의:

  • 각 블록은 한 변이 1 mm1\text{ mm}인 정사각형이다(행렬의 . 또는 x 하나가 1 mm×1 mm1\text{ mm} \times 1\text{ mm} 블록 하나에 해당한다).
  • 흰색 영역은 흰색 블록들의 집합이다.
  • 어떤 흰색 영역이 연속된 흰색 영역이라는 것은, 그 영역의 임의의 두 블록을 잇는 경로가 존재하고, 경로의 모든 블록이 그 영역 안에 있으며, 경로에서 이웃한 두 블록이 변을 공유(상하좌우 4방향 인접)하는 경우를 말한다.
  • XX축의 양의 방향은 왼쪽에서 오른쪽, YY축의 양의 방향은 위에서 아래이다.
  • 가장 큰 연속된 흰색 영역이 항상 물체이며, 그 영역은 항상 유일하다.
  • 서로 다른 사진에서 물체의 모양이 다르게 보일 수 있다.

입력

입력은 여러 개의 데이터 케이스로 이루어진다. 각 케이스는 두 정수 mm과 kk가 적힌 줄로 시작한다. 그 뒤에 여러 개의 m×km \times k 행렬(mm개의 열, kk개의 행)이 이어지며, 각 행렬은 카메라가 찍은 사진 한 장이다. 사진은 항상 두 장 이상이다.

한 케이스 안에서 인접한 두 행렬 사이에는 -가 mm개 있는 구분선이 들어간다. 케이스의 마지막 행렬 뒤에는 =가 mm개 있는 종료선이 들어간다.

두 개의 0이 적힌 줄은 입력의 끝을 나타낸다.

각 사진의 크기는 최대 256×256256 \times 256이고, 한 케이스에는 최대 256256장의 사진이 들어간다.

출력

각 테스트 케이스마다 한 줄에 두 수를 출력한다. 각각 물체의 XX 방향 속도와 YY 방향 속도이며, 소수점 아래 둘째 자리까지 정확히 출력한다. 속도의 단위는 mm/s이다.

예제3

  1. 예제 1

    입력
    10 5
    .........x
    .....xxx.x
    ....xxx...
    .....xxx..
    x.........
    ----------
    .........x
    .........x
    ...xxx....
    ..xxx.....
    x..xxx....
    ==========
    0 0
    
    예상 출력
    -2.00 1.00
    
  2. 예제 2

    입력
    6 3
    xxx...
    xxx...
    xxx...
    ------
    ...xxx
    ...xxx
    ...xxx
    ======
    0 0
    
    예상 출력
    3.00 0.00
    
  3. 예제 3

    입력
    5 5
    .xx..
    .xx..
    .....
    .....
    ....x
    -----
    ....x
    .....
    .xx..
    .xx..
    .....
    =====
    0 0
    
    예상 출력
    0.00 2.00