보석 퍼즐의 한 수 (Small1)

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

요약
인접한 두 보석을 맞바꾸어 연쇄 제거와 낙하를 시뮬레이션하고 최대로 제거되는 보석 수를 구합니다.
난이도

보통10점 중 4점

유형
시뮬레이션, 완전 탐색
정답자
아직 제출이 없습니다

문제

존은 보석 맞추기 게임을 하면서 한 수로 얼마나 많은 보석을 없앨 수 있는지 알려주는 프로그램을 원한다.

게임판은 보석이 놓인 격자다. 보석 하나는 대문자 한 글자로 적고, 같은 글자로 적힌 보석은 같은 색이다.

BGR
GRR
BGY

한 수는 가로나 세로로 맞닿은 보석 두 개를 맞바꾸는 것이다. 둘째 줄의 앞쪽 보석 두 개를 맞바꾸면 판이 이렇게 된다.

BGR
RGR
BGY

이때 같은 색 보석이 가로나 세로로 3개 이상 연달아 놓이면 그 보석은 모두 한꺼번에 사라진다. 이 예에서는 초록 보석 3개가 사라진다. 빈칸은 마침표로 적는다.

B.R
R.R
B.Y

여러 묶음이 한꺼번에 사라지기도 한다. 다음 판을 보자.

RGOY
RGOG
OOYO
RGOG
YBOB

가운데 줄에서 가장 오른쪽 주황 보석과 그 옆의 노랑 보석을 맞바꾼다.

RGOY
RGOG
OOOY
RGOG
YBOB

가로 3개와 세로 5개가 만들어지고, 여기에 속한 보석이 모두 사라진다.

RG.Y
RG.G
...Y
RG.G
YB.B

그다음 빈칸 위에 있던 보석이 아래로 떨어진다.

...Y
RG.G
RG.Y
RG.G
YB.B

떨어지면서 새로 만들어진 3개 이상의 묶음도 사라진다.

...Y
...G
...Y
...G
YB.B

같은 색 보석이 3개 이상 연달아 놓인 가로줄이나 세로줄이 없어질 때까지 이 과정을 반복한다. 전체 과정을 정리하면 다음과 같다.

  • 보석 두 개를 맞바꾼다.
  • 같은 색 보석이 3개 이상 연달아 놓인 가로줄이나 세로줄이 있는 동안 다음을 반복한다.
    • 그 보석을 모두 없앤다.
    • 빈칸 위에 보석이 남지 않을 때까지, 아래가 빈칸인 보석을 아래로 내린다.

실제 게임에서는 없어진 자리에 위에서 새 보석이 떨어져 들어오지만, 이 문제에서는 그런 일이 없다. 각 열의 위쪽은 빈칸으로 남는다.

게임판이 주어지면, 한 번의 맞바꾸기로 없앨 수 있는 보석 개수의 최댓값을 구하라.

입력

첫째 줄에 테스트 케이스의 개수 TT가 주어진다. 각 테스트 케이스의 첫째 줄에는 두 정수 NN과 MM이 공백으로 구분되어 주어진다. 이어지는 NN개 줄에는 각각 대문자 MM개가 주어지고, 한 글자가 보석 하나를 나타낸다. 같은 글자로 적힌 보석은 같은 색이다.

제한

  • 보석을 나타내는 문자는 모두 대문자다.
  • 입력 판에는 같은 색 보석이 가로나 세로로 3개 이상 연달아 놓인 곳이 없다.
  • 1≤T≤201 \le T \le 20
  • 3≤N≤103 \le N \le 10
  • 3≤M≤103 \le M \le 10

출력

각 테스트 케이스마다 Case #C: D 꼴로 한 줄씩 출력한다. CC는 1부터 시작하는 테스트 케이스 번호이고, DD는 한 번의 맞바꾸기로 없앨 수 있는 보석 개수의 최댓값이다. 어떤 맞바꾸기로도 보석이 사라지지 않으면 DD는 0이다.

예제2

  1. 예제 1

    입력
    3
    3 3
    BGR
    GRR
    BGY
    5 4
    RGOY
    RGOG
    OOYO
    RGOG
    YBOB
    3 3
    ABC
    DEF
    GHI
    
    예상 출력
    Case #1: 3
    Case #2: 13
    Case #3: 0
    
  2. 예제 2

    입력
    2
    3 3
    AAB
    BBA
    ABA
    3 6
    BBABBA
    AABAAB
    ABABAB
    
    예상 출력
    Case #1: 6
    Case #2: 12