問題
$1$ から $N$ までの整数が一個ずつ書かれた $ N \times N $ のマス目 $P$ が与えられます。
次の2種類の操作を繰り返すことで、すべての $k$ に対して「整数 $k$ が上から $k$ 行目・左から $k$ 列目のマスに存在する」ようにするためには、最小何回の操作が必要ですか。
🔹隣接する2つの行を交換する。
🔹隣接する2つの列を交換する。
[制約]
🔹$ 2 \leqq N \leqq 100 $
解き方・ソースコード
まず行の操作と列の操作を分解できないかどうかを考えます。
$i$ 行目に書かれた唯一の整数を $X_i$、$j$ 列目に書かれた唯一の整数を $Y_j$ とすると、以下の2点が成り立ちます。
🔹$i$行目と $i+1$ 行目を交換した場合: $X_i$ と $X_{i+1}$ のみが入れ替わり、$Y$ は不変
🔹$j$列目と $j+1$ 列目目を交換した場合: $Y_j$ と $Y_{j+1}$ のみが入れ替わり、$X$ は不変
このことは「行に対する操作」と「列に対する操作」を分けてよいことを意味しています。
また、目的通りの盤面になっていることと、$X=[1,2,3,4]$ かつ $Y=[1,2,3,4]$ になっていることはまったく同じです。
したがって、入力例1の最小操作回数は
🔹値1:最小何回の「隣接要素の交換」で、配列 $X$ を $[1,2,3,4]$ にできるか。
🔹値2:最小何回の「隣接要素の交換」で、配列 $Y$ を $[1,2,3,4]$ にできるか。
の総和となります。
[Google Colaboratory]
1 | #-------- 入力例1 --------- |
[実行結果]
解: 5
最小操作回数が5回であることが確認できました。