
신비의 바다를 중심으로 펼쳐지는 특별한 다이빙 대회가 열린다. 이번 대회에서 다이버는 한 번에 여러 물고기를 잡을 수 있는 특수한 작살을 장착하고 출전한다.
바다는 격자로 나타내고, 격자의 어떤 칸들에는 물고기가 존재한다. 작살의 유효 사거리는 로, 다이버가 특정 칸에서 작살을 사용하면 그 칸의 상하좌우 방향으로 사이에 정확히 개의 칸을 두고 떨어진 곳에 존재하는 칸의 물고기를 한 번에 잡을 수 있다. 즉, 한 번의 작살질로 최대 마리의 물고기를 잡을 수 있다. 또한 각 물고기는 최대 한 번만 잡힐 수 있다.
편의상 번째 행 번째 열의 격자칸을 라고 나타내자. 예를 들어, , 일 때, 에서 작살을 사용하면 , , , 의 물고기를 한 번에 잡을 수 있다.
격자에 존재하는 물고기 정보와 작살의 유효 사거리 가 주어질 때, 최대한 많은 물고기를 잡기 위해 작살을 사용할 최소 개수의 칸을 구하는 프로그램을 작성하시오.
입력 형식
첫 줄에 격자의 크기를 나타내는 정수 과 작살의 사거리를 나타내는 정수 가 주어진다. ( )
그다음 개의 줄의 번째 줄에는
격자의 번째 행을 이루는 개 문자가 공백 없이 주어진다.
각 문자는 ., O, x, @ 중 하나고,
.는 물고기가 없음을, O는 물고기가 있음을 나타낸다.
또한 x는 작살을 던질 수 없는 곳임을,
@는 작살을 던질 수 없지만 물고기가 있음을 나타낸다.
출력 형식
최대로 많은 물고기를 잡기 위해서
작살을 사용할 최소 개수의 칸을 나타내기 위해,
첫 줄부터 개의 줄에 걸쳐,
각 줄마다 개 문자를 공백 없이 출력한다.
각 문자는 . 또는 v이어야 하며,
문자 v는 작살을 사용할 칸을 나타낸다.
답이 여러 개일 경우, 아무거나 하나를 출력한다.
예제 1
입력
3 1 O.O .@. O.x
출력
v.. ... v..
예제 2
입력
5 2 ..O.. @x..O ..O.. .Ox.. ...O.
출력
.v... ...v. ..... ..... ....v
예제 설명
첫 번째 예제의 경우, 번의 작살질로 총 마리의 물고기를 잡을 수 있다.
채점 방식
입력 케이스들은 다음과 같은 종류로 구별되며, 한 종류의 케이스를 다 맞혀야 그 종류에 배정된 점수를 받을 수 있다.
종류 1: 29점
종류 2: 36점
종류 3: 35점
모든 입력 케이스가 주어짐.
해설
어떤 격자칸에서 작살을 사용할 때 물고기를 잡는 칸들을 모두 하나의 그룹으로 묶습니다. 이제, 각 그룹에 대해 독립적으로 문제를 해결할 수 있습니다.
각 그룹은 도 기울어진 격자판의 형태를 갖습니다. 격자판의 높이가 으로 매우 작음에 유의해야 합니다.
각 그룹에서 물고기가 있는 칸들을 크기의 정사각형으로 커버하는 문제를 해결해야 합니다. 이는 각 열에 대해 어떤 칸들이 이미 커버되었는지를 bitmask로 관리하는 DP로 해결할 수 있습니다.