루비크 큐브

아직 제출이 없습니다시간 제한1초메모리 제한128 MB

문제

오래된 루비크 큐브를 발견하고, 큐브의 상태를 기록하고 돌리는 동작을 시뮬레이션하는 프로그램을 작성하려고 한다.

루비크 큐브는 페이슬릿(facelet) 이라고 부르는 54개의 작은 정사각형 면으로 덮여 있으며, 여섯 면 각각에 9개씩 있다. 각 페이슬릿은 하나의 색을 가진다. 큐브가 맞춰진 상태일 때는 한 면의 아홉 페이슬릿이 모두 같은 색을 갖는다. 원래 큐브의 여섯 색은 빨강, 노랑, 초록, 파랑, 흰색, 주황이다.

그림 1: 앞면을 돌리는 모습.

큐브의 면을 돌려 페이슬릿의 위치를 바꿀 수 있다. 한 면을 돌리면 9개의 작은 큐브가 붙은 페이슬릿과 함께 새로운 위치로 이동한다(그림 1 참고).

시작 상태와 돌릴 면들의 목록이 주어질 때, 모든 회전을 마친 뒤의 각 페이슬릿 색을 구한다.

입력

첫 줄에는 시나리오의 개수가 주어진다. 각 시나리오는 두 부분으로 이루어진다. 먼저 큐브의 시작 상태가, 그다음 수행할 회전이 이어진다.

시작 상태. 색은 한 글자로 표현되며(페이슬릿 하나당 한 글자, 공백 하나로 구분), 큐브를 펼친 전개도 모양으로 배치된다(그림 2 참고). 위에서 아래로:

  • 윗면을 나타내는 세 줄. 앞면 바로 위에 오도록 각 줄을 공백 6칸 들여쓴다.
  • 왼면, 앞면, 오른면, 뒷면을 이어 나열한 세 줄. 각 면의 행을 공백 하나로 구분해 이어 붙이면 한 줄당 12개의 글자가 된다.
  • 아랫면을 나타내는 세 줄. 윗면과 마찬가지로 들여쓴다.

그림 2: 입력과 출력에 사용하는 전개도 모양.

회전. 이 부분은 회전 횟수 $t$ ($t > 0$)가 적힌 줄로 시작한다. 이어지는 $t$개의 줄에는 공백 하나로 구분된 두 정수 $s$와 $d$가 있다. $s$는 돌릴 면을 선택하며, 왼면 $0$, 앞면 $1$, 오른면 $2$, 뒷면 $3$, 윗면 $4$, 아랫면 $5$로 번호를 매긴다. $d$는 방향으로, 해당 면 $s$를 정면으로 바라보는 사람을 기준으로 $1$은 시계 방향, $-1$은 반시계 방향을 뜻한다.

출력

각 시나리오마다 Scenario #i: 줄을 출력한다. 여기서 $i$는 $1$부터 시작하는 시나리오 번호이다. 그 다음에 입력과 똑같은 배치로 회전을 모두 수행한 뒤의 큐브 상태를 출력한다. 연속된 두 시나리오 사이에는 빈 줄 하나를 넣어 구분한다.