만드는 중입니다

아직 만드는 중이라 바뀔 수 있습니다

리카와 거울

시간 제한14초메모리 제한512 MB

요약
n×m 격자에서 거울을 놓을 수 있는 칸이 주어질 때, 거울을 최대 k개 놓았을 때 빛 경로 길이 합의 최솟값을 k=0부터 nm까지 구합니다.
난이도

어려움10점 중 9점

유형
동적 계획법, 비트 연산, 시뮬레이션
정답자
아직 제출이 없습니다

문제

Mirror는 Steam에 있는 설명하기 어렵지만 재미있는 게임이다. 하지만 이 문제는 실제 거울에 관한 문제다.

리카는 n×mn \times m 크기의 반투명 격자를 가지고 있다. 격자 각 칸의 한 변 길이는 정확히 11이다. 리카는 격자 바깥에서 어떤 칸 변의 가운데 점을 향해, 그 변에 수직으로 빛을 쏠 수 있다. 빛은 격자 안에서 진행한 뒤, 다른 칸 변의 가운데 점으로 격자를 빠져나간다. 격자 안에서 빛이 지나는 경로의 길이는 쉽게 계산할 수 있다.

격자 안에는 여러 개의 거울이 있고, 거울의 길이는 정확히 2\sqrt{2}다. 거울은 칸의 왼쪽 아래 꼭짓점과 오른쪽 위 꼭짓점을 잇는 자리에 놓거나, 왼쪽 위 꼭짓점과 오른쪽 아래 꼭짓점을 잇는 자리에 놓는다. 빛이 거울에 닿으면 물리 법칙에 따라 반사되어 진행 방향이 바뀐다.

예를 들어 보자. 격자의 크기는 3×43 \times 4이고, 격자 안에 거울이 4개 있다. 리카가 칸 (3,3)(3, 3)의 아래쪽 변 가운데 점으로 빛을 쏘면, 빛은 결국 거울 4개를 모두 거쳐 칸 (1,1)(1, 1)의 위쪽 변 가운데 점으로 나온다. 이때 빛의 경로 길이는 77이다.

빛을 쏘는 방법은 2(n+m)2 (n + m)가지다. 리카는 이 모든 방법에서 나온 빛 경로 길이의 합을 격자의 값으로 정의한다.

이제 리카에게는 거울이 하나도 없는 빈 n×mn \times m 격자가 있다. 리카는 거울 몇 개를 칸에 놓아 격자의 값을 최소로 만들려고 한다. 각 칸에는 거울을 최대 1개까지만 놓을 수 있다. 안타깝게도 일부 칸은 거울 슬롯이 고장 나 있어서 거울을 전혀 놓을 수 없다. 리카는 값을 직접 계산하는 일을 포기하고 답을 구해 달라고 부탁한다. 거울을 0개, 최대 1개, 최대 2개, ..., 최대 n×mn \times m개 놓았을 때 격자 값의 최솟값을 차례로 구하라. 즉 n×m+1n \times m + 1개의 수를 구한다.

입력

첫 줄에 테스트 케이스의 수 tt (1≤t≤1001 \leq t \leq 100)가 주어진다.

각 테스트 케이스의 첫 줄에는 두 정수 nn, mm (1≤n≤51 \leq n \leq 5, 1≤m≤71 \leq m \leq 7)이 주어진다.

이어서 nn개의 줄이 주어지며, 각 줄은 길이 mm의 이진 문자열이다. ii번째 줄의 jj번째 문자가 "1"이면 칸 (i,j)(i, j)에 거울을 놓을 수 있고, "0"이면 놓을 수 없다.

n=5n = 5이고 m=7m = 7인 테스트 케이스는 최대 2개임이 보장된다.

출력

각 테스트 케이스마다 n×m+1n \times m + 1개의 정수를 한 줄에 출력한다. ii번째 수는 거울을 최대 i−1i - 1개 놓았을 때 격자 값의 최솟값이다.

예제1

  1. 예제 1

    입력
    2
    3 3
    101
    011
    101
    4 4
    1111
    1111
    1111
    1111
    
    예상 출력
    36 36 36 36 20 20 20 20 20 20
    64 64 64 64 40 40 40 40 32 32 32 32 24 24 24 24 24