No.2986 Permutation Puzzle
レベル : / 実行時間制限 : 1ケース 2.000秒 / メモリ制限
: 512 MB / スペシャルジャッジ問題 (複数の解が存在する可能性があります)
タグ : / 解いたユーザー数 14
作問者 : ID 21712
タグ : / 解いたユーザー数 14
作問者 : ID 21712
問題文最終更新日: 2024-12-10 09:03:48
問題文
$N$行$N$列の各列・各行が$1$$\dots$$N$の順列で構成されている行列$A$があります
$N=4の一例$ $4\ 1\ 3\ 2$ $2\ 4\ 1\ 3$ $3\ 2\ 4\ 1$ $1\ 3\ 2\ 4$この行列$A$に対して次の操作いずれかを選び実行するを$K$回行い行列$B$を生成します
- 列を$1$つ選び、その列の順列の数字に従って行列の列の位置を並びかえる
- 行を$1$つ選び、その行の順列の数字に従って行列の行の位置を並びかえる
並び替えの疑似コード
# 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$ $1回目の操作:\ 3列目を選び列を並び替える$ $3列目の順列\ \dots\ 3\ 1\ 4\ 2$ $操作前$ $操作後$ $4\ 1\ 3\ 2$ $1\ 2\ 4\ 3$ $2\ 4\ 1\ 3$ $4\ 3\ 2\ 1$ $3\ 2\ 4\ 1$ $2\ 1\ 3\ 4$ $1\ 3\ 2\ 4$ $3\ 4\ 1\ 2$ $・操作前の1列目を3列目に移動$ $・操作前の2列目を1列目に移動$ $・操作前の3列目を4列目に移動$ $・操作前の4列目を2列目に移動$ $2回目の操作:\ 4行目を選び行を並び替える$ $4行目の順列\ \dots\ 3\ 4\ 1\ 2$ $操作前$ $操作後$ $1\ 2\ 4\ 3$ $2\ 1\ 3\ 4$ $4\ 3\ 2\ 1$ $3\ 4\ 1\ 2$ $2\ 1\ 3\ 4$ $1\ 2\ 4\ 3$ $3\ 4\ 1\ 2$ $4\ 3\ 2\ 1$ $・操作前の1行目を3行目に移動$ $・操作前の2行目を4行目に移動$ $・操作前の3行目を1行目に移動$ $・操作前の4行目を2行目に移動$ $3回目の操作:\ 4行目を選び行を並び替える$ $4行目の順列\ \dots\ 4\ 3\ 2\ 1$ $操作前$ $操作後$ $2\ 1\ 3\ 4$ $4\ 3\ 2\ 1$ $3\ 4\ 1\ 2$ $1\ 2\ 4\ 3$ $1\ 2\ 4\ 3$ $3\ 4\ 1\ 2$ $4\ 3\ 2\ 1$ $2\ 1\ 3\ 4$ $・操作前の1行目を4行目に移動$ $・操作前の2行目を3行目に移動$ $・操作前の3行目を2行目に移動$ $・操作前の4行目を1行目に移動$行列$B$に対して同様の操作を$1000$回以下の実行で行列$A$と等しくしてください。 その操作手順を出力してください。
等しくする操作手順が複数通りある場合はどれを出力しても構いません(操作回数を最小にする必要はなく$1000$回以下であればどれでもよいです)。
入力
$N\ K$ $A_{1,1}\ A_{1,2}\ \dots\ A_{1,N}$ $A_{2,1}\ A_{2,2}\ \dots\ A_{2,N}$ $:$ $A_{N,1}\ A_{N,2}\ \dots\ A_{N,N}$ $B_{1,1}\ B_{1,2}\ \dots\ B_{1,N}$ $B_{2,1}\ B_{2,2}\ \dots\ B_{2,N}$ $:$ $B_{N,1}\ B_{N,2}\ \dots\ B_{N,N}$
$4\ \le\ N\ \le 10$
$2\ \le\ K\ \le\ 4$
$1\ \le\ A_{i,j}\ \le N\ (1\ \le\ i,j\ \le\ N)$
$1\ \le\ B_{i,j}\ \le N\ (1\ \le\ i,j\ \le\ N)$
行列$A$,行列$B$の各行・各列は$1$$\dots$$N$の順列になっている
行列$A$に対してちょうど$K$回の操作で行列$B$を生成している
行列$A$と行列$B$が等しくなっていないものだけをテストケースに選んでいる
出力
$M$ $X_1\ P_1$ $X_2\ P_2$ $:$ $X_M\ P_M$行列$B$を行列$A$に等しくするための操作を出力します
操作回数が$M$のとき最初の行に$M$を出力し、続けて操作を行った順番に操作を$M$行分出力してください。
$X_i$は操作が列か行を表し、列を操作したときは文字"
C
"、行を操作したときは文字"R
"$P_i$は選択した位置の番号を表します
(例: $3$列目を選択なら
C 3
、$10$行目を選択ならR 10
)最後に改行してください。
$1\ \le\ M\ \le\ 1000$
$X_i\ =\ "C"\ または\ "R"\ (1\ \le\ i\ \le\ 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
この操作手順は次のようになります
操作前他にも$5$手のR 1
C 4
$4\ 3\ 2\ 1$ $2\ 1\ 3\ 4$ $4\ 1\ 3\ 2$ $1\ 2\ 4\ 3$ $3\ 4\ 1\ 2$ $2\ 4\ 1\ 3$ $3\ 4\ 1\ 2$ $1\ 2\ 4\ 3$ $3\ 2\ 4\ 1$ $2\ 1\ 3\ 4$ $4\ 3\ 2\ 1$ $1\ 3\ 2\ 4$
R 4, R 1, C 4, C 2, C 1
の手順でも行列$A$と等しくなるのでこの$5$手を出力しても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もしくは右上の雲マークをクリックしてアカウントを作成してください。