問題一覧 > 通常問題

No.2986 Permutation Puzzle

レベル : / 実行時間制限 : 1ケース 2.000秒 / メモリ制限 : 512 MB / スペシャルジャッジ問題 (複数の解が存在する可能性があります)
タグ : / 解いたユーザー数 18
作問者 : ID 21712
1 ProblemId : 11672 / 出題時の順位表 / 自分の提出
問題文最終更新日: 2024-12-13 13:37:01
2024-12-13更新1: "クリックで開く"の文言を書き足し
2024-12-13更新2: レベルを★2から★2.5に上方修正

問題文

NNNN列の各列・各行が11\dotsNNの順列で構成されている行列AAがあります

N=4の一例N=4の一例
4 1 3 24\ 1\ 3\ 2
2 4 1 32\ 4\ 1\ 3
3 2 4 13\ 2\ 4\ 1
1 3 2 41\ 3\ 2\ 4
この行列AAに対して次の操作いずれかを選び実行するをKK回行い行列BBを生成します
  • 列を11つ選び、その列の順列の数字に従って行列の列の位置を並びかえる
  • 行を11つ選び、その行の順列の数字に従って行列の行の位置を並びかえる
並び替えの疑似コード (クリックで開く)
# A, B, S, T ... 行列
# .At(i, j) ... 行列の i 行目 j 列目の値を参照したり、値を代入したり
# P <- Q ... 右辺 Q から左辺 P への値・行列のコピー

# 行列 S の X 列目を選択して列の位置を並び替える
function reorder_cols_by_col_perm(S, X)
    T <- S
    for r in range(1...N)
        for c in range(1...N)
            S.At(r, T.At(c, X)) <- T.At(r, c)
    return S

# 行列 S の Y 行目を選択して行の位置を並び替える
function reorder_rows_by_row_perm(S, Y)
    T <- S
    for r in range(1...N)
        for c in range(1...N)
            S.At(T.At(Y, r), c) <- T.At(r, c)
    return S

# 行列 A から K 回操作して行列 B にする処理(テストケース生成)のイメージ
    S <- A
    for _ in range(1...K)
        e <- random_one(1...2N)
        if e <= N
            X <- e
            S <- reorder_cols_by_col_perm(S, X)
        else
            Y <- (e - N)
            S <- reorder_rows_by_row_perm(S, Y)
    B <- S

操作の例: N=4,K=3操作の例:\ N=4,K=3
        
1回目の操作: 3列目を選び列を並び替える1回目の操作:\ 3列目を選び列を並び替える
3列目の順列  3 1 4 23列目の順列\ \dots\ 3\ 1\ 4\ 2
操作前操作前    操作後操作後
4 1 3 24\ 1\ 3\ 2    1 2 4 31\ 2\ 4\ 3
2 4 1 32\ 4\ 1\ 3    4 3 2 14\ 3\ 2\ 1
3 2 4 13\ 2\ 4\ 1    2 1 3 42\ 1\ 3\ 4
1 3 2 41\ 3\ 2\ 4    3 4 1 23\ 4\ 1\ 2
・操作前の1列目を3列目に移動・操作前の1列目を3列目に移動
・操作前の2列目を1列目に移動・操作前の2列目を1列目に移動
・操作前の3列目を4列目に移動・操作前の3列目を4列目に移動
・操作前の4列目を2列目に移動・操作前の4列目を2列目に移動

2回目の操作: 4行目を選び行を並び替える2回目の操作:\ 4行目を選び行を並び替える
4行目の順列  3 4 1 24行目の順列\ \dots\ 3\ 4\ 1\ 2
操作前操作前    操作後操作後
1 2 4 31\ 2\ 4\ 3    2 1 3 42\ 1\ 3\ 4
4 3 2 14\ 3\ 2\ 1    3 4 1 23\ 4\ 1\ 2
2 1 3 42\ 1\ 3\ 4    1 2 4 31\ 2\ 4\ 3
3 4 1 23\ 4\ 1\ 2    4 3 2 14\ 3\ 2\ 1
・操作前の1行目を3行目に移動・操作前の1行目を3行目に移動
・操作前の2行目を4行目に移動・操作前の2行目を4行目に移動
・操作前の3行目を1行目に移動・操作前の3行目を1行目に移動
・操作前の4行目を2行目に移動・操作前の4行目を2行目に移動

3回目の操作: 4行目を選び行を並び替える3回目の操作:\ 4行目を選び行を並び替える
4行目の順列  4 3 2 14行目の順列\ \dots\ 4\ 3\ 2\ 1
操作前操作前    操作後操作後
2 1 3 42\ 1\ 3\ 4    4 3 2 14\ 3\ 2\ 1
3 4 1 23\ 4\ 1\ 2    1 2 4 31\ 2\ 4\ 3
1 2 4 31\ 2\ 4\ 3    3 4 1 23\ 4\ 1\ 2
4 3 2 14\ 3\ 2\ 1    2 1 3 42\ 1\ 3\ 4
・操作前の1行目を4行目に移動・操作前の1行目を4行目に移動
・操作前の2行目を3行目に移動・操作前の2行目を3行目に移動
・操作前の3行目を2行目に移動・操作前の3行目を2行目に移動
・操作前の4行目を1行目に移動・操作前の4行目を1行目に移動
行列BBに対して同様の操作を10001000回以下の実行で行列AAと等しくしてください。 その操作手順を出力してください。
等しくする操作手順が複数通りある場合はどれを出力しても構いません(操作回数を最小にする必要はなく10001000回以下であればどれでもよいです)。

入力

N KN\ K
A1,1 A1,2  A1,NA_{1,1}\ A_{1,2}\ \dots\ A_{1,N}
A2,1 A2,2  A2,NA_{2,1}\ A_{2,2}\ \dots\ A_{2,N}
::
AN,1 AN,2  AN,NA_{N,1}\ A_{N,2}\ \dots\ A_{N,N}
B1,1 B1,2  B1,NB_{1,1}\ B_{1,2}\ \dots\ B_{1,N}
B2,1 B2,2  B2,NB_{2,1}\ B_{2,2}\ \dots\ B_{2,N}
::
BN,1 BN,2  BN,NB_{N,1}\ B_{N,2}\ \dots\ B_{N,N}

4  N 104\ \le\ N\ \le 10
2  K  42\ \le\ K\ \le\ 4
1  Ai,j N (1  i,j  N)1\ \le\ A_{i,j}\ \le N\ (1\ \le\ i,j\ \le\ N)
1  Bi,j N (1  i,j  N)1\ \le\ B_{i,j}\ \le N\ (1\ \le\ i,j\ \le\ N)
行列AA,行列BBの各行・各列は11\dotsNNの順列になっている
行列AAに対してちょうどKK回の操作で行列BBを生成している
行列AAと行列BBが等しくなっていないものだけをテストケースに選んでいる

出力

MM
X1 P1X_1\ P_1
X2 P2X_2\ P_2
::
XM PMX_M\ P_M
行列BBを行列AAに等しくするための操作を出力します
操作回数がMMのとき最初の行にMMを出力し、続けて操作を行った順番に操作をMM行分出力してください。
XiX_iは操作が列か行を表し、列を操作したときは文字"C"、行を操作したときは文字"R"
PiP_iは選択した位置の番号を表します
(例: 33列目を選択ならC 31010行目を選択ならR 10)
最後に改行してください。
1  M  10001\ \le\ M\ \le\ 1000
Xi = "C" または "R" (1  i  M)X_i\ =\ "C"\ または\ "R"\ (1\ \le\ i\ \le\ M)
1  Pi  N (1  i  M)1\ \le\ P_i\ \le\ N\ (1\ \le\ i\ \le\ M)

サンプル

サンプル1
入力
4 3
4 1 3 2
2 4 1 3
3 2 4 1
1 3 2 4
4 3 2 1
1 2 4 3
3 4 1 2
2 1 3 4
出力
2
R 1
C 4

この操作手順は次のようになります

操作前     R 1        C 4
    4 3 2 14\ 3\ 2\ 1    2 1 3 42\ 1\ 3\ 4    4 1 3 24\ 1\ 3\ 2
    1 2 4 31\ 2\ 4\ 3    3 4 1 23\ 4\ 1\ 2    2 4 1 32\ 4\ 1\ 3
    3 4 1 23\ 4\ 1\ 2    1 2 4 31\ 2\ 4\ 3    3 2 4 13\ 2\ 4\ 1
    2 1 3 42\ 1\ 3\ 4    4 3 2 14\ 3\ 2\ 1    1 3 2 41\ 3\ 2\ 4
他にも55手のR 4, R 1, C 4, C 2, C 1の手順でも行列AAと等しくなるのでこの55手を出力してもACになります。

サンプル2
入力
4 3
4 1 3 2
2 4 1 3
3 2 4 1
1 3 2 4
2 4 1 3
1 3 2 4
4 1 3 2
3 2 4 1
出力
1
R 1

サンプル3
入力
7 2
2 1 7 5 4 3 6
6 5 4 2 1 7 3
1 7 6 4 3 2 5
5 4 3 1 7 6 2
4 3 2 7 6 5 1
3 2 1 6 5 4 7
7 6 5 3 2 1 4
5 3 4 6 7 1 2
7 5 6 1 2 3 4
1 6 7 2 3 4 5
4 2 3 5 6 7 1
3 1 2 4 5 6 7
2 7 1 3 4 5 6
6 4 5 7 1 2 3
出力
5
R 5
R 5
C 6
C 5
C 6

サンプル4
入力
10 4
9 8 7 5 1 4 2 10 3 6
3 2 1 9 5 8 6 4 7 10
8 7 6 4 10 3 1 9 2 5
5 4 3 1 7 10 8 6 9 2
1 10 9 7 3 6 4 2 5 8
6 5 4 2 8 1 9 7 10 3
2 1 10 8 4 7 5 3 6 9
7 6 5 3 9 2 10 8 1 4
4 3 2 10 6 9 7 5 8 1
10 9 8 6 2 5 3 1 4 7
7 1 3 5 6 9 10 4 2 8
10 4 6 8 9 2 3 7 5 1
1 5 7 9 10 3 4 8 6 2
2 6 8 10 1 4 5 9 7 3
5 9 1 3 4 7 8 2 10 6
3 7 9 1 2 5 6 10 8 4
9 3 5 7 8 1 2 6 4 10
6 10 2 4 5 8 9 3 1 7
4 8 10 2 3 6 7 1 9 5
8 2 4 6 7 10 1 5 3 9
出力
19
R 2
R 4
R 8
R 7
R 3
C 4
C 4
C 4
C 4
C 4
R 1
R 10
R 7
R 3
R 3
R 9
R 5
R 3
R 9

提出するには、Twitter 、GitHub、 Googleもしくは右上の雲マークをクリックしてアカウントを作成してください。