퍼즐 조립

시간 제한0.5초메모리 제한64 MB

요약
모서리가 잘린 n x n 조각 네 개를 회전하고 뒤집어 (2n-1) x (2n-1) 정사각형을 빈틈이나 겹침 없이 채우고, 사전순으로 가장 작은 결과를 출력한다.
난이도

어려움10점 중 8점

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

문제

어린 P는 과자 봉지에서 나오는 퍼즐 조각을 모읍니다. 정사각형으로 맞출 수 있는 네 조각을 모으면, 종이에 붙여서 우편으로 보냅니다.

조각은 판지로 만들어졌고 양면이 똑같아 보이기 때문에, 각 조각은 8가지 방법으로 사용할 수 있습니다(현재 방향 그대로, 90°·180°·270°로 회전한 것, 그리고 각각을 뒤집은 것까지).

모든 조각은 처음에 n×nn \times n 정사각형입니다. 각 조각에서 서로 인접한 두 변을 골라 1×11 \times 1 칸 몇 개를 잘라냅니다. 고른 각 변에서 최소한 한 칸은 잘라내고, 최소한 한 칸은 남깁니다. 네 조각을 합치면 (2n−1)×(2n−1)(2n-1) \times (2n-1) 정사각형이 됩니다.

각 조각에는 1부터 4까지의 번호가 붙어 있습니다. 조각의 모든 칸에는 그 조각의 번호가 적혀 있고, 잘려 나간 칸에는 0이 적혀 있습니다.

위의 네 조각을 합쳐 아래와 같은 7×77 \times 7 정사각형을 만들었습니다.

네 개의 n×nn \times n 조각이 순서대로 주어집니다. 각 조각은 회전하거나 뒤집을 수 있습니다. 네 조각을 서로 겹치거나 빈틈이 생기지 않도록 완벽하게 맞추어 (2n−1)×(2n−1)(2n-1) \times (2n-1) 정사각형을 만드세요.

입력

첫째 줄에 퍼즐 조각의 한 변의 길이인 정수 nn이 주어집니다.

이어지는 줄들에 네 조각이 순서대로 주어집니다. 각 조각은 nn개의 줄로 표현되고, 각 줄에는 nn개의 숫자가 공백 하나로 구분되어 있습니다. 연속한 조각 사이는 빈 줄로 구분됩니다.

출력

2n−12n-1개의 줄을 출력합니다. 각 줄에는 2n−12n-1개의 숫자를 공백 하나로 구분하여 완성된 정사각형을 나타냅니다(각 칸에는 그 칸을 덮은 조각의 번호가 적힙니다).

가능한 배치가 여러 가지일 수 있습니다. 그중 사전순으로 가장 작은 것을 출력하세요. 모든 숫자를 위에서 아래로, 한 줄 안에서는 왼쪽에서 오른쪽으로 읽어 하나의 수열을 만들고, 유효한 모든 배치 중에서 두 수열이 처음으로 달라지는 위치에서 더 작은 수열을 출력합니다.

제한

  • 3≤n≤203 \le n \le 20
  • 모든 테스트 케이스에는 유효한 배치가 적어도 하나 존재합니다.

예제2

  1. 예제 1

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

    입력
    4
    1 1 1 1
    1 1 1 0
    1 1 1 1
    1 1 0 1
    
    2 2 2 2
    2 2 2 0
    2 2 2 0
    0 2 2 0
    
    0 3 0 0
    3 3 3 0
    3 3 3 0
    3 3 3 3
    
    4 4 4 0
    4 4 4 4
    4 4 4 4
    0 0 4 0
    
    예상 출력
    1 1 1 1 3 3 3
    1 1 1 3 3 3 3
    1 1 1 1 3 3 3
    1 1 4 1 2 2 3
    4 4 4 4 2 2 2
    4 4 4 4 2 2 2
    4 4 4 2 2 2 2