|
2006年12月22日
情報オリンピック日本委員会
|
2n 枚のカードが,上からどのような順番で並んでいるかを配列に保存し, その配列を更新し続ければ良い.
ここでは, 「カードの並びの保存の仕方」 「k でカットの実行の仕方」 「リフルシャッフルの実行の仕方」 について解説を行う.
データの保存の仕方
「操作を行う前のカードの並びを蓄える配列」と 「操作を行った後のカードの並びを蓄える配列」の2つを準備すると良いだろう.
サイズ 2n の1次元配列を(2つ)準備し,そこにカードの並びを保存すればよい. たとえば,カードが上から 3, 5, 1, 4, 2 の順に並んでいるとしたら, 配列に 3, 5, 1, 4, 2 の順番に値を保存する.
一番最初は,上から 1, 2, 3, ... , 2n の順に積み重なっているので, 配列に保存されているデータも, 順に 1, 2, 3, ... , 2n となる.
k でカットの実行の仕方
まず, 「操作を行う前のカードの並びを保存している配列」の k+1 番目から 2n 番目 までの値を, 「操作を行う後のカードの並びを保存している配列」の 1番目から 2n-k 番目までにコピーする.
その後, 「操作を行う前のカードの並びを保存している配列」の 1 番目から k 番目までの 値を, 「操作を行う後のカードの並びを保存している配列」の 2n-k+1 番目から 2n-k 番目までにコピーすればよい.
最後に, 「操作を行う後のカードの並びを保存している配列」 の内容を, 「操作を行う前のカードの並びを保存している配列」 にコピーしておく.
リフルシャッフルの実行の仕方
「操作を行う前のカードの並びを保存している配列」の j 番目の値を,
コピーするようにすればよい.
最後に, 「操作を行う後のカードの並びを保存している配列」 の内容を, 「操作を行う前のカードの並びを保存している配列」 にコピーしておく.
プログラム全体の処理の流れは,
となる.