[Back to the Problem Page]
[問題ページへ戻る]

ヒント



(芳沢 光雄)


問題ページの Java アプレットでは、手数が膨大になってしまいます(数百程度)。 お手軽な perl スクリプトを作ってみましたので、 必要ならこちらで遊んで見てください: 15.pl
15.pl を実行後、プロンプトに対し、 「A」「a」「B」「b」「C」「c」などのコマンドを入力します。 それらの機能は実際に実行すればわかります。 これらを組み合わせたコマンドもいくつかあります。 スクリプトを見てください。終了は「x」です。

さらなる余計なお世話(^^;:
誰もがperlを使える環境にある訳でもないですので、もう少し解説します。 パズルの操作を表現する一番単純な方法は、空白の移動を記述することです。 最終的な配置になるまでに、空白は元の位置(原点とよぶことにします)に 何度か戻ることでしょう。 その際、一度原点を出てから次に原点にもどるまでの部分に着目します。 もし、途中で、ひとコマ進んですぐに後戻りするような動きがあればそれらは キャンセルしてしまいますので、なかったものと思うことができます。 そうすると、本質的にそのような動きは の6つになります。もちろんコマ自身は逆方向に動きます。 例えば、初期状態で「A」の操作を行うと下図のようになります:
[ 2][ 3][ 4][ 5]          [ 3][ 4][ 5][ 6]
[ 1]        [ 6]          [ 2]        [ 7]
[ 9][ 8][ 7]        =>    [ 1][ 9][ 8]    
[10]        [15]          [10]        [15]
[11][12][13][14]          [11][12][13][14]
そして、これらの間には

C=BA, c=ab, C13=1, ....

などの関係があります。 ただし、「積」は、一番左の操作から順番に行うものとします (つまり普通の写像の合成と逆の書き方)。また 1 は何もしない操作を表します。

これらの操作を使って、まず、となりあう2つのコマ (たとえば[1]と[2])を入れ換える操作を工夫してみて下さい。 もちろんその副作用として、他のコマが動いてしまうのですが、 次に同様な方法で[2]と[3]を入れ換える操作を行うことで、 他のコマの動きをもとに戻すことができるようならばいいわけです。

その他の方法もいろいろためすと、さらに短い手順のものも見つかります。 管理人自身は上の6つの操作を20回行って並べ替える方法を見つけました。 もっと短いものがあれば教えて下さい。 [webmaster@ math.josai.ac.jpにメールを下さい。]

(管理人)