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

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

회문 십자말풀이

면접 대비

시간 제한60초메모리 제한1024 MB

요약
가로와 세로의 모든 최대 단어가 회문이 되도록 격자의 빈칸을 최대한 채우고, 채운 개수와 완성된 격자를 출력한다.
난이도

보통10점 중 6점

유형
유니온 파인드, 시뮬레이션, 구현, 문자열 매칭
정답자
아직 제출이 없습니다

문제

십자말풀이는 아래 그림처럼 검은 칸과 A-Z 글자로 이루어진 직사각형 격자다.

십자말풀이에서 단어는 가로 또는 세로로 연속한 글자 중 최대 구간으로 정의한다. 아래 십자말풀이에서 DO와 ON은 단어의 예다.

회문 십자말풀이는 모든 단어가 회문인 십자말풀이다. Ri,j는 i번째 행, j번째 열의 글자를 나타내며 i와 j는 1부터 시작한다. 왼쪽 위 칸은 R1,1이다. 아래 회문 십자말풀이 예에서 R3,2의 B는 R3,1에서 시작하는 가로 단어와 R4,2에서 끝나는 세로 단어에 모두 속하며, 두 단어 모두 회문이다.

N행 M열의 회문 십자말풀이를 선물로 받았다. 십자말풀이를 다 풀고 단서를 버린 뒤 벽에 걸어 두려던 참에, 실수로 글자 일부를 지워 버렸다. 십자말풀이를 최대한 복원하고 싶지만 단서는 이제 없다. 십자말풀이가 회문이라는 사실만 가지고, 주어진 십자말풀이에서 빠진 글자를 최대한 많이 복원하자.

빠진 글자는 아래 그림에서 빈 흰 칸으로 나타낸다. 왼쪽 십자말풀이는 주어진 십자말풀이고, 오른쪽 십자말풀이는 글자를 최대한 복원한 결과다. 남은 칸은 복원할 정보가 충분하지 않아 채울 수 없다.

입력

입력의 첫 줄에는 테스트 케이스의 수 T가 주어진다. 그다음 T개의 테스트 케이스가 이어진다.

각 테스트 케이스의 첫 줄에는 십자말풀이의 행 수와 열 수를 나타내는 두 정수 N과 M이 주어진다.

다음 N개 줄은 격자의 N개 행을 나타낸다. i번째 줄은 Ri,1, Ri,2, …, Ri,M을 나타내는 M개 문자로 이루어진다. 각 문자는 다음 중 하나다.

  • 알파벳 대문자(A-Z)
  • 빠진 글자를 나타내는 마침표(.)(예시 십자말풀이의 빈 흰 칸)
  • 검은 칸을 나타내는 샵(#)

출력

각 테스트 케이스마다 Case #x: y를 한 줄에 출력한다. x는 테스트 케이스 번호(1부터 시작)이고 y는 채운 빈 흰 칸의 수다. 그다음 N개 줄에 최종 격자를 출력한다. 빠진 글자(.)는 가능한 경우 알파벳 대문자(A-Z)로 바꾼다.

제한

  • 1 ≤ T ≤ 100.
  • 주어진 입력 격자를 회문 십자말풀이가 되도록 채우는 방법이 적어도 하나 존재한다.
  • 격자의 모든 문자는 {A-Z, #, .}에 속한다.

힌트

예제 2에서 빈칸 8개를 채울 수 있다. 빠진 글자를 다음과 같이 채울 수 있다.

  • 1행 4열: 1행 1열의 글자에서 A임을 알 수 있다.
  • 2행 4열=A, 1행 4열에서.
  • 2행 6열=A, 2행 4열에서.
  • 3행 6열=A, 2행 6열에서.
  • 3행 2열=B, 3행 1열에서.
  • 4행 2열=B, 3행 2열에서.
  • 4행 3열=B, 4행 2열에서.
  • 4행 4열=A, 4행 11열에서.

예제1

  1. 예제 1

    입력
    2
    2 2
    A.
    .#
    4 6
    A...#.
    B##...
    B.###.
    A...#.
    
    예상 출력
    Case #1: 2
    AA
    A#
    Case #2: 8
    A..A#.
    B##A.A
    BB###A
    ABBA#.