조각 그림 퍼즐

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

요약
모든 조각을 R행 C열 격자에 회전만 허용하여 배치하되 맞닿은 변의 글자가 같고 바깥 둘레가 모두 테두리(0)가 되게 하고, 사전순으로 가장 작은 배열을 출력한다.
난이도

어려움10점 중 8점

유형
백트래킹, 완전 탐색, 구현, 행렬
정답자
아직 제출이 없습니다

문제

소들이 알파벳 조각 그림 퍼즐을 맞추고 있다. 퍼즐은 RR개의 행과 CC개의 열로 이루어지며 (1≤R≤101 \le R \le 10, 1≤C≤101 \le C \le 10), 조각들이 맞물리는 부분은 튀어나온 판지 모양이 아니라 각 변에 적힌 글자로 표현된다.

각 조각은 하나의 일련번호와 네 변의 정보로 주어진다. 한 변은 소문자(a–z)이거나 문자 0이다. 0은 조립된 직사각형의 바깥쪽에 놓이는 변, 즉 테두리를 뜻한다. 모서리 조각은 테두리 변이 두 개, 가장자리 조각은 한 개이며, (충분히 큰 퍼즐이라면) 내부 조각은 테두리 변이 없다.

퍼즐을 풀려면 모든 조각을 R×CR \times C 격자에 배치해서 다음을 만족해야 한다.

  • 서로 맞닿은 두 조각의 접하는 변에는 같은 글자가 적혀 있어야 한다.
  • 격자 바깥 경계에 놓인 모든 변은 테두리(0)여야 하고, 내부에서 맞닿는 변은 테두리가 아니어야 한다.

조각은 네 방향 중 어느 쪽으로든 회전할 수 있지만, 뒤집을 수는 없다. 네 변이 시계 방향으로 나열되므로, 조각을 회전하는 것은 이 목록을 순환 이동시키는 것과 같다.

아래 그림은 여섯 조각을 맞춘 한 가지 예이다. 맞닿은 변끼리는 같은 글자를 공유하고, 직사각형의 바깥쪽은 모두 테두리이다.

              +---+  +---+  +---+
              | 1 c  c 3 d  d 5 |
              +-d-+  + a +  +-e-+

              +-d-+  +-a-+  +-e-+
              | 2 b  b 4 b  b 6 |
              +---+  +---+  +---+

RR과 CC가 큰 퍼즐일수록 변에 쓰이는 글자가 더 다양해서 맞추기가 쉬운 편이다. 유효한 조립 방법은 항상 존재한다.

입력

  • 첫째 줄에 두 정수 RR과 CC가 주어진다.
  • 다음 R×CR \times C개의 줄에는 각각 한 조각의 정보가 주어진다: 정수 일련번호와 그 뒤에 시계 방향으로 나열된 네 변의 식별자.

출력

조립된 퍼즐을 R×CR \times C개의 줄로 출력한다. C⋅(i−1)+jC \cdot (i-1) + j번째 줄에는 ii행 jj열(행과 열은 1부터 시작하며, 위에서 아래로 행 순서대로)에 놓인 조각의 정보를 출력한다: 일련번호 다음에 네 변을 위, 오른쪽, 아래, 왼쪽 순서로 출력한다.

규칙을 만족하는 조립 방법이 여러 가지일 수 있다. 그중 사전순으로 가장 작은 것을 출력하며, 그 기준은 다음과 같다. 각 조립을 위 순서에 따른 줄들의 나열로 보고, 한 줄을 튜플

(일련번호,위,오른쪽,아래,왼쪽)(\text{일련번호}, \text{위}, \text{오른쪽}, \text{아래}, \text{왼쪽})

로 나타낸다. 두 조립을 이 튜플의 나열로서 앞에서부터 원소별로 비교한다. 일련번호는 정수로, 변의 글자는 문자값으로 비교한다. 이 순서에서 가장 작은 단 하나의 조립을 출력한다.

예제3

  1. 예제 1

    입력
    2 3
    1 c d 0 0
    2 0 d b 0
    3 c 0 d a
    4 b a b 0
    5 d 0 0 e
    6 0 0 b e
    
    예상 출력
    1 0 c d 0
    3 0 d a c
    5 0 0 e d
    2 d b 0 0
    4 a b 0 b
    6 e 0 0 b
    
  2. 예제 2

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

    입력
    2 2
    3 s e 0 0
    4 0 0 r s
    1 0 h r 0
    2 0 0 e h
    
    예상 출력
    1 0 h r 0
    2 0 0 e h
    4 r s 0 0
    3 e 0 0 s