상자 퍼즐

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

요약
회전 가능한 정육면체 박스 n^2개를 n×n 격자에 배치해 맞닿는 옆면 숫자가 같고 바깥쪽 옆면은 0이 되도록 한 뒤 배치와 회전 횟수를 구하는 문제입니다.
난이도

보통10점 중 6점

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

문제

n2n^2개의 정육면체 상자가 있다. 각 상자의 윗면과 네 옆면에는 정수가 적혀 있다. 이 상자들을 n×nn \times n 격자에 하나씩 놓아 퍼즐을 완성해야 한다.

조건은 다음과 같다.

  1. 상자는 바닥과 평행하게만 돌릴 수 있다. 따라서 윗면은 항상 위를 향한다.
  2. 배치가 끝나면 서로 맞닿은 두 옆면의 숫자가 같아야 한다.
  3. 격자 바깥을 향하는 옆면의 숫자는 0이어야 한다.

아래 그림은 조건을 만족하는 배치를 보여 준다.

동그라미 안의 숫자는 상자의 윗면에 적힌 수이고, 그 둘레의 숫자는 네 옆면에 적힌 수이다. 그림처럼 9개의 상자를 놓으면 모든 조건을 만족한다.

각 상자의 숫자가 주어질 때, 조건을 만족하도록 상자를 배치하고 각 상자의 회전 횟수를 구하시오.

입력

첫째 줄에 nn이 주어진다. (2≤n≤5)(2 \le n \le 5)

둘째 줄부터 n2n^2개의 줄에 걸쳐 한 줄에 한 상자의 정보가 주어진다. 각 줄의 첫 번째 수는 윗면에 적힌 정수이고, 이어지는 네 수는 위에서 보았을 때 네 옆면에 적힌 정수를 시계방향 순서로 나열한 것이다.

윗면에 적힌 정수는 n2n^2 이하의 자연수이며 서로 모두 다르다. 옆면에 적힌 정수는 9 이하의 음이 아닌 정수이다. 입력은 항상 조건을 만족하는 배치가 존재하는 경우만 주어진다.

출력

먼저 상자의 윗면에 적힌 정수들을 n×nn \times n 행렬 형태로 출력한다.

이어서 각 상자가 입력으로 주어진 상태에서 시계방향으로 몇 번 회전했는지를 나타내는 정수를 n×nn \times n 행렬 형태로 출력한다. 회전 횟수는 0 이상 3 이하이다.

예제1

  1. 예제 1

    입력
    3
    1 3 6 2 0
    2 5 0 0 2
    3 0 4 3 0
    4 0 8 5 4
    5 2 4 0 0
    6 5 6 9 6
    7 0 0 3 8
    8 9 2 0 4
    9 3 0 5 6
    
    예상 출력
    3 4 7
    1 6 9
    5 8 2
    0 0 0
    0 0 0
    0 0 0