3차원 막대 미로

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

요약
정육면체의 여섯 면이 각각 2차원 미로일 때, 마커가 반대편 내부 모서리까지 가는 최단 이동 순서를 사전순으로 가장 앞서게 구한다.
난이도

보통10점 중 6점

유형
BFS, 그래프, 시뮬레이션, 구현
정답자
아직 제출이 없습니다

문제

3차원 미로는 속이 빈 정육면체로 만듭니다. 정육면체는 정수 좌표를 쓰며, 한 꼭짓점 (0,0,0)(0,0,0)에서 반대쪽 꼭짓점 (n−1, n−1, n−1)(n-1,\,n-1,\,n-1)까지의 영역을 차지합니다. 정육면체의 여섯 면에는 각각 2차원 미로가 있습니다. 각 면은 n×nn\times n 격자이고, 칸은 벽(X)이거나 열린 칸(빈칸)입니다. 모든 면의 테두리 칸은 항상 벽이므로, 열린 칸은 각 면 내부의 무늬를 이룹니다.

정육면체 안에는 표식 하나와 막대 여섯 개가 있습니다. 각 막대는 표식에서 출발해 정육면체의 한 면을 곧장 뚫고 나갑니다. 막대가 어떤 면을 지날 때, 그 면과 평행한 표식의 두 좌표가 가리키는 한 칸으로 나옵니다. 여섯 개의 출구 칸이 모두 열려 있을 때에만 표식은 그 격자점에 있을 수 있으며, 막대 중 하나라도 벽 칸에 닿으면 그 위치는 막혀 있습니다.

표식은 (1,1,1)(1,1,1)에서 시작해 (n−2, n−2, n−2)(n-2,\,n-2,\,n-2)에 도착해야 합니다. 한 번 움직일 때마다 전체 구조가 한 축을 따라 한 칸씩 미끄러집니다. 여섯 가지 이동은 각각 F(Forward, 앞), B(Back, 뒤), L(Left, 왼쪽), R(Right, 오른쪽), U(Up, 위), D(Down, 아래)로 표기합니다. 표식의 위치를 (x,y,z)(x,y,z)(1≤x,y,z≤n−21\le x,y,z\le n-2)라 하면:

  • B는 xx를 1 늘리고, F는 xx를 1 줄입니다.
  • L은 yy를 1 늘리고, R은 yy를 1 줄입니다.
  • U는 zz를 1 늘리고, D는 zz를 1 줄입니다.

이동은 도착 위치가 정육면체 안에 있고 막혀 있지 않을 때에만 허용됩니다. (1,1,1)(1,1,1)에서 (n−2, n−2, n−2)(n-2,\,n-2,\,n-2)까지 표식을 옮기는 가장 짧은 이동 순서를 구하세요.

입력

입력은 여러 개의 테스트 케이스로 이루어집니다. 각 테스트 케이스는 정수 nn(4≤n≤304 \le n \le 30)이 적힌 줄로 시작합니다. 이어지는 6n6n개의 줄은 여섯 면을 차례대로 설명하며, 각 면은 정확히 nn개의 문자로 이루어진 nn개의 줄로 주어집니다(각 문자는 벽을 뜻하는 X 또는 열린 칸을 뜻하는 빈칸입니다).

면은 다음의 고정된 순서와 방향으로 주어집니다.

  1. 앞면 Forward — 윗면과 맞닿은 모서리가 위쪽, 오른쪽면과 맞닿은 모서리가 오른쪽에 오도록 배치.
  2. 오른쪽면 Right — 윗면 모서리가 위쪽, 뒷면 모서리가 오른쪽.
  3. 뒷면 Back — 윗면 모서리가 위쪽, 왼쪽면 모서리가 오른쪽.
  4. 왼쪽면 Left — 윗면 모서리가 위쪽, 앞면 모서리가 오른쪽.
  5. 윗면 Up — 뒷면 모서리가 위쪽, 왼쪽면 모서리가 오른쪽.
  6. 아랫면 Down — 뒷면 모서리가 위쪽, 왼쪽면 모서리가 오른쪽.

같은 내용을 좌표로 나타내면, M=n−1M = n-1이고 표식의 위치가 (x,y,z)(x,y,z)일 때 각 면을 지나는 막대는 그 면의 아래 표에 있는 (0부터 세는) 행과 열로 나옵니다. 이 여섯 칸 중 하나라도 벽이면 그 위치는 막혀 있습니다.

면 (입력 순서)행열
1. 앞면 ForwardM−zM-zM−yM-y
2. 오른쪽면 RightM−zM-zxx
3. 뒷면 BackM−zM-zyy
4. 왼쪽면 LeftM−zM-zM−xM-x
5. 윗면 UpM−xM-xyy
6. 아랫면 DownM−xM-xyy

테스트 케이스 목록은 0 하나만 있는 줄로 끝나며, 이 줄은 테스트 케이스가 아닙니다.

출력

각 테스트 케이스마다 한 줄을 출력합니다. 표식을 (1,1,1)(1,1,1)에서 (n−2, n−2, n−2)(n-2,\,n-2,\,n-2)로 옮기는, 길이가 가장 짧은 이동 순서를 출력하세요. 순서의 각 문자는 F, B, L, R, U, D 중 하나입니다. 가장 짧은 순서가 여러 개이면 F<B<L<R<U<DF < B < L < R < U < D 순서에서 사전순으로 가장 앞선 것을 출력합니다. 모든 테스트 케이스에는 적어도 하나의 해가 존재함이 보장됩니다.

예제3

  1. 예제 1

    입력
    7
    XXXXXXX
    X     X
    X XXX X
    X     X
    X XXX X
    X XXX X
    XXXXXXX
    XXXXXXX
    X     X
    X X X X
    X X X X
    X X X X
    X X X X
    XXXXXXX
    XXXXXXX
    X     X
    X     X
    X     X
    X     X
    X     X
    XXXXXXX
    XXXXXXX
    X     X
    X X X X
    X     X
    X X X X
    X     X
    XXXXXXX
    XXXXXXX
    X XXX X
    X XXX X
    X XXX X
    X XXX X
    X     X
    XXXXXXX
    XXXXXXX
    X     X
    X XXX X
    X X X X
    X XXX X
    X     X
    XXXXXXX
    0
    
    예상 출력
    UULLLLUUBBBB
    
  2. 예제 2

    입력
    4
    XXXX
    X  X
    X  X
    XXXX
    XXXX
    X  X
    X  X
    XXXX
    XXXX
    X  X
    X  X
    XXXX
    XXXX
    X  X
    X  X
    XXXX
    XXXX
    X  X
    X  X
    XXXX
    XXXX
    X  X
    X  X
    XXXX
    0
    
    예상 출력
    BLU
    
  3. 예제 3

    입력
    5
    XXXXX
    X   X
    X   X
    X   X
    XXXXX
    XXXXX
    X   X
    X   X
    X   X
    XXXXX
    XXXXX
    X   X
    X   X
    X   X
    XXXXX
    XXXXX
    X   X
    X   X
    X   X
    XXXXX
    XXXXX
    X   X
    X   X
    X   X
    XXXXX
    XXXXX
    X   X
    X   X
    X   X
    XXXXX
    0
    
    예상 출력
    BBLLUU