주사위 퍼즐

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

요약
표준 주사위 27개로 이루어진 3x3x3 큐브에서 맞닿은 면이 7이 되고 손잡이 방향이 고정된다는 조건 아래, 주어진 윗면과 앞면 정보에 맞는 모든 배치를 찾아 오른쪽 면 합으로 가능한 값을 모두 구합니다.
난이도

보통10점 중 7점

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

문제

다음과 같은 주사위 퍼즐을 생각하자.

  1. 모든 주사위는 마주 보는 두 면의 합이 항상 77인 보통의 정육면체 주사위이다(즉 11의 반대편은 66, 22의 반대편은 55, 33의 반대편은 44이다). 모든 주사위의 방향(카이랄성)은 동일하며, 11이 위, 22가 앞을 향할 때 33이 오른쪽에 오는 오른손 방향 주사위이다.
  2. 이런 주사위 2727개를 쌓아 3×3×33 \times 3 \times 3 정육면체를 만든다.
  3. 서로 맞닿은 두 주사위의 접촉면에 적힌 두 수의 합은 반드시 77이어야 한다. 예를 들어 접촉하는 한 면이 22이면 맞닿은 반대쪽 면은 55이다.
  4. 정육면체의 윗면과 앞면에 보이는 주사위 면 중 일부가 주어지고, 나머지 면은 알 수 없다.
  5. 가능한 배치란 위의 모든 규칙을 지키면서 주어진 윗면·앞면 정보와 일치하도록 2727개의 주사위를 놓고 방향을 정한 것을 말한다.

가능한 각 배치에 대해 정육면체의 오른쪽 면에 나타나는 99개의 수를 모두 더한다. 이 오른쪽 면 합으로 나올 수 있는 값을 모두 구하는 것이 목표이다.

입력

첫 줄에 데이터셋의 개수 NN이 주어진다. 이어서 NN개의 데이터셋이 주어진다.

각 데이터셋은 여섯 줄로 이루어진다. 처음 세 줄은 정육면체의 윗면을 3×33 \times 3 격자로 나타낸다.

T11 T12 T13
T21 T22 T23
T31 T32 T33

다음 세 줄은 같은 방식으로 앞면을 3×33 \times 3 격자로 나타낸다.

F11 F12 F13
F21 F22 F23
F31 F32 F33

각 TijT_{ij}와 FijF_{ij}는 해당 면에 적힌 수(11 이상 66 이하의 정수)이거나, 그 면을 알 수 없음을 뜻하는 00이다. 한 줄의 값들은 공백으로 구분된다.

두 격자의 열에 왼쪽부터 11부터 33까지 번호를 매긴다. 정육면체는 열마다 하나씩 세 개의 세로 층으로 나뉘며, 윗면 뷰의 jj번째 열과 앞면 뷰의 jj번째 열은 같은 층을 나타낸다. 이 층에는 깊이(앞뒤)와 높이(아래위)로 배열된 아홉 개의 주사위가 들어 있다. 그 윗면 뷰 열의 세 값은 이 층의 윗면들을 깊이마다 하나씩 나타내고, 그 앞면 뷰 열의 세 값은 이 층의 앞면들을 높이마다 하나씩 나타낸다. 따라서 층 안에서 특정 깊이와 높이에 있는 주사위는 그 깊이의 윗면과 그 높이의 앞면을 보인다.

출력

각 데이터셋에 대해 가능한 모든 배치를 고려하고, 각 배치마다 정육면체 오른쪽 면의 아홉 개 면 RijR_{ij}(다른 뷰와 같은 방식으로 번호를 매긴다)의 합, 즉 ∑i=13∑j=13Rij\sum_{i=1}^{3}\sum_{j=1}^{3} R_{ij}를 계산한다.

데이터셋마다 한 줄에, 서로 다른 오른쪽 면 합들을 오름차순으로 공백 하나로 구분하여 출력한다. 가능한 배치가 하나도 없으면 00 하나만 출력한다. 출력은 정확히 일치하는지 비교하므로, 줄 끝에 불필요한 공백을 남기지 않는다.

예제1

  1. 예제 1

    입력
    4
    1 1 1
    1 1 1
    1 1 1
    2 2 2
    2 2 2
    2 2 2
    4 3 3
    5 2 2
    4 3 3
    6 1 1
    6 1 1
    6 1 0
    1 0 0
    0 2 0
    0 0 0
    5 1 2
    5 1 2
    0 0 0
    2 0 0
    0 3 0
    0 0 0
    0 0 0
    0 0 0
    3 0 1
    
    예상 출력
    27
    24
    32 33 36
    0