아직 만들고 있는 페이지입니다.

이 페이지는 아직 만드는 중입니다. 보이는 내용은 바뀔 수 있습니다.

두 배 놀이

시간 제한10초메모리 제한256 MB

요약
0과 1로 이루어진 격자에서 수가 같은 이웃 칸끼리 합치는 이동으로 각 칸에 모을 수 있는 가장 큰 토큰 수를 구합니다.
난이도

어려움10점 중 8점

유형
동적 계획법, BFS, 그래프
정답자
아직 제출이 없습니다

문제

두 배 놀이는 게임이라기보다 퍼즐에 가깝다. 놀이판은 단위 정사각형 칸으로 나뉜 직사각형이다. 처음에 어떤 칸에는 토큰이 하나 놓여 있고, 나머지 칸은 비어 있다.

목표는 한 칸에 토큰을 최대한 많이 쌓는 것이다. 할 수 있는 동작은 하나뿐이다. 변을 맞대고 있는 두 칸의 토큰 개수가 같고 그 개수가 1 이상이면, 한 칸의 토큰을 모두 다른 칸으로 옮길 수 있다.

놀이판의 처음 상태가 주어지면 칸마다 그 칸에 모을 수 있는 토큰의 최대 개수를 구하는 프로그램을 작성하시오.

입력

첫 줄에 놀이판의 행 개수 nn과 열 개수 mm이 주어진다 (1≤n,m≤2001 \le n, m \le 200).

다음 nn개 줄에는 각각 0과 1로 이루어진 길이 mm의 문자열이 주어진다. 1은 토큰이 놓인 칸, 0은 빈 칸이다.

출력

nn개 줄에 각각 mm개의 정수를 공백 하나로 구분해 출력한다. ii번째 줄의 jj번째 수는 주어진 처음 상태에서 시작해 ii행 jj열 칸에 모을 수 있는 토큰의 최대 개수다.

칸마다 답을 따로 세며, 어느 칸이든 같은 처음 상태에서 시작한다. 동작을 한 번도 하지 않아도 되므로 토큰이 놓인 칸의 답은 1 이상이고, 빈 칸의 답은 0이다.

힌트

첫 번째 예제의 놀이판에서 둘째 줄 넷째 칸에 토큰 4개를 모으는 과정이다. 먼저 첫째 줄 셋째 칸의 토큰을 넷째 칸으로 옮기면 첫째 줄 넷째 칸에 2개가 쌓인다. 다음으로 둘째 줄 셋째 칸의 토큰을 넷째 칸으로 옮기면 둘째 줄 넷째 칸에도 2개가 쌓인다. 이제 두 칸은 세로로 맞닿아 있고 개수가 같으므로, 첫째 줄 넷째 칸의 2개를 둘째 줄 넷째 칸으로 옮겨 4개를 만든다.

예제3

  1. 예제 1

    입력
    3 4
    0111
    1011
    1011
    
    예상 출력
    0 2 4 4
    2 0 4 4
    2 0 4 4
    
  2. 예제 2

    입력
    1 1
    1
    
    예상 출력
    1
    
  3. 예제 3

    입력
    4 4
    1111
    1111
    1111
    1111
    
    예상 출력
    4 8 8 4
    8 16 16 8
    8 16 16 8
    4 8 8 4