액자 쌓기

시간 제한1초메모리 제한128 MB

요약
격자 위에 겹쳐 놓은 여러 글자 프레임 그림이 주어질 때, 아래에서 위로 쌓은 순서를 복원하고 가능한 모든 순서를 사전순으로 출력한다.
난이도

보통10점 중 7점

유형
그래프, 위상 정렬, DFS, 구현
정답자
아직 제출이 없습니다

문제

다음과 같은 5개의 사진 액자가 9 x 8 격자 위에 놓여 있다.

........ ........ ........ ........ .CCC....
EEEEEE.. ........ ........ ..BBBB.. .C.C....
E....E.. DDDDDD.. ........ ..B..B.. .C.C....
E....E.. D....D.. ........ ..B..B.. .CCC....
E....E.. D....D.. ....AAAA ..B..B.. ........
E....E.. D....D.. ....A..A ..BBBB.. ........
E....E.. DDDDDD.. ....A..A ........ ........
E....E.. ........ ....AAAA ........ ........
EEEEEE.. ........ ........ ........ ........

   1         2        3        4        5

이제 1번 액자를 맨 아래에, 5번 액자를 맨 위에 두는 순서로 액자들을 위로 포개어 쌓는다. 한 액자가 다른 액자를 덮으면 그 아래 액자의 덮인 부분은 가려진다. 이렇게 쌓인 5개의 액자를 위에서 내려다보면 다음과 같이 보인다.

.CCC....
ECBCBB..
DCBCDB..
DCCC.B..
D.B.ABAA
D.BBBB.A
DDDDAD.A
E...AAAA
EEEEEE..

이때 아래에서 위로 액자가 쌓인 순서는 무엇인가? 이 그림에서는 답이 EDABC이다. 주어진 그림으로부터 액자가 아래에서 위로 쌓인 순서를 알아내는 것이 이 문제이다. 규칙은 다음과 같다.

  1. 액자의 두께는 항상 정확히 1칸이며, 각 변의 길이는 3칸 이상이다.
  2. 각 액자의 네 변은 모두 최소한 일부가 보인다. 모서리에서는 두 변이 동시에 보인다.
  3. 각 액자에는 서로 다른 대문자가 하나씩 붙어 있으며, 두 액자가 같은 문자를 가지는 경우는 없다.

입력

각 입력 블록의 첫 번째 줄에는 높이 hh (h≤30h \le 30), 두 번째 줄에는 너비 ww (w≤30w \le 30)가 주어진다. 이어서 쌓인 액자의 그림이 각 줄에 정확히 ww개의 문자로 이루어진 hh개의 줄로 주어진다.

입력에는 이러한 블록이 빈 줄 없이 여러 개 연속으로 주어질 수 있으며, 모든 블록을 순서대로 처리해야 한다.

출력

각 블록에 대해 액자가 아래에서 위로 쌓인 순서대로 문자를 출력한다. 그림과 일치하는 순서가 여러 개라면 가능한 모든 순서를 알파벳 순으로 한 줄에 하나씩 출력한다. 모든 블록에는 항상 최소한 하나의 올바른 순서가 존재한다. 모든 블록의 결과를 빈 줄 없이(블록 사이에도 빈 줄 없이) 순서대로 이어서 출력한다.

예제4

  1. 예제 1

    입력
    9
    8
    .CCC....
    ECBCBB..
    DCBCDB..
    DCCC.B..
    D.B.ABAA
    D.BBBB.A
    DDDDAD.A
    E...AAAA
    EEEEEE..
    
    예상 출력
    EDABC
    
  2. 예제 2

    입력
    3
    3
    AAA
    A.A
    AAA
    
    예상 출력
    A
    
  3. 예제 3

    입력
    3
    7
    AAA.BBB
    A.A.B.B
    AAA.BBB
    
    예상 출력
    AB
    BA
    
  4. 예제 4

    입력
    6
    6
    AAAA..
    A..A..
    A.BBBB
    AABA.B
    ..B..B
    ..BBBB
    
    예상 출력
    AB