만드는 중입니다

아직 만드는 중이라 바뀔 수 있습니다

정사각형 격자 퍼즐

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

요약
N×N 격자의 수를 행 우선 순서로 정렬하는 이동 목록을 출력합니다. 위쪽 행을 아래로, 왼쪽 열을 오른쪽으로 옮기는 연산만 쓰며 이동은 3N번 미만이어야 합니다.
난이도

어려움10점 중 8점

유형
시뮬레이션, 행렬, 구현
정답자
아직 제출이 없습니다

문제

이 퍼즐에서는 00부터 시작하는 N×NN \times N 정사각형 격자가 주어지며, 격자에는 00부터 N×N−1N \times N - 1까지의 서로 다른 정수가 들어 있다. 목표는 모든 0≤i,j<N0 \le i, j < N에 대해 ii행 jj열의 수가 i×N+ji \times N + j와 같은 정렬 상태에 도달하는 것이다. 이 목표는 다음 두 종류의 이동으로 달성할 수 있다.

  • D 이동(아래 이동): "D a[0]a[0] a[1]a[1] …\dots a[N−1]a[N - 1]" 형식으로 쓴다. a[0],a[1],…,a[N−1]a[0], a[1], \dots, a[N - 1]은 맨 위 행에 있는 수들을 재배열한 것이다. 이 이동은 맨 위 행을 없애고, a[0]a[0]부터 a[N−1]a[N - 1]까지를 왼쪽에서 오른쪽 순서로 적은 새 행을 격자 맨 아래에 추가한다.
  • R 이동(오른쪽 이동): "R b[0]b[0] b[1]b[1] …\dots b[N−1]b[N - 1]" 형식으로 쓴다. b[0],b[1],…,b[N−1]b[0], b[1], \dots, b[N - 1]은 맨 왼쪽 열에 있는 수들을 재배열한 것이다. 이 이동은 맨 왼쪽 열을 없애고, b[0]b[0]부터 b[N−1]b[N - 1]까지를 위에서 아래 순서로 적은 새 열을 격자 오른쪽에 추가한다.

재배열은 수를 더하거나 빼지 않고 순서만 바꾸는 것을 말하며, 원래 순서를 그대로 둘 수도 있다.

예를 들어 현재 격자가 다음과 같다고 하자.

행/열001122
00224466
11881155
22773300

이동 "D 66 22 44"를 수행하면 다음 격자가 된다.

행/열001122
00881155
11773300
22662244

반면 이동 "R 22 88 77"을 수행하면 다음과 같다.

행/열001122
00446622
11115588
22330077

N=3N = 3일 때 목표 격자는 다음과 같다.

행/열001122
00001122
11334455
22667788

3×N3 \times N번보다 적은 이동으로 퍼즐을 푸는 것이 목표다. 이동 횟수가 더 많거나 퍼즐을 풀지 못해도 부분 점수를 받을 수 있다.

입력

첫 줄에 정수 NN이 주어진다. 다음 NN개 줄에는 초기 격자가 주어지며, 각 줄에 NN개의 수가 있다.

출력

첫 줄에 이동 횟수 MM을 출력한다. 다음 MM개 줄에는 이동을 한 줄에 하나씩 출력한다.

제한

2≤N≤92 \le N \le 9이다. 22부터 99까지의 각 NN에 대해 테스트 케이스 수는 같다.

예제2

  1. 예제 1

    입력
    3
    1 4 2
    3 7 5
    6 8 0
    
    예상 출력
    4
    R 3 6 1
    D 2 3 4
    D 5 6 7
    R 2 5 8
    
  2. 예제 2

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