16パズル

本日会社にアルバイト希望を出してきた青年の面接を行いました。

履歴書と一緒に送られてきたサンプルプログラムに16パズルがあったので、いじわるな質問を。

ちなみに16パズルとは1〜15までの数字が書かれた正方形のタイルを盤面に入れて適当に入れてゆき、つだけ穴を開けておき、この穴を利用して、タイルをスライドさせて、最終的に数字を整列させるアレです。

「最初にパネルを単純にランダムに並べているようですが、これだと絶対解けないパターンが出来ますね。ご存じでしたか?」

これを20代ソコソコで答えられたら数学科の学生か数学マニアなので、答えられなくても当たり前です。なんで、こんな質問をしたかというと、次の質問への呼び水のため。

「では絶対解ける配置にするようにするにはどうしたらよいでしょう?」

ここで適切なアルゴリズムを思いつくかどうかを期待して質問してみたわけです。

16パズルが解けるかどうかを知っていなくても、絶対解けるようにするやり方くらいは機転の聞く人なら思いつくはずです。例えば、

「もう完成した完成図から何回か動かして、それを最初の出題とする」

という答えを期待したりしたんですが、ちょっと期待大きすぎだったか?

ちなみに解ける解けないの判定の簡単な説明をしておきます。

穴の位置にも16のタイルがあると仮定してください。 2つのタイルを入れ替える操作を繰り返し、完成形になるまでの繰り返します。 この入れ替えは隣同士でなく、タイルを盤面から取り、物理的に入れ替えることを意味します。 完成系になるように入れ替えて行くやり方はいろいろあるのですが、ある盤面からある盤面に変換する入れ替えの回数が偶数であるか奇数であるかは最初の盤面の配置で決まります。 すなわち、どのように入れ替えて言っても、完成形になるまでの手数の数は偶数であるか奇数であるかが決まっているのです。これは偶置換と奇置換といって代数学では有名な定理です。 タイルをスライドさせるというのは16とその隣のタイルを入れ替えるということと考えられます。 ところで、最初に16が右下にあると仮定すると奇数回の移動では16のタイルは右下にはやってくることがありません。必ず偶数回の移動をしなければなりません。 したがって、ある盤面から完成形に移動する入れ替えの回数が奇数ならば、どうやっても完成形に持っていくことはできません。 これは例えば1と2が入れ替わっただけの16パズルを解こうと努力をしてみるとわかります。どんなに頑張っても解くことができません。 では、逆に入れ替え回数が偶数ならば解けるのかと言えば、これは真です。(証明は実際にアルゴリズムを提示しないとだめですが) したがって、よりスマートな解法としては 「解けないと判定できたら任意の2つのタイルを入れ替える」 これで必ず解ける16パズルが完成します。

Posted by issei

カテゴリ: 雑記

コメント一覧

>これは例えば1と2が入れ替わっただけの16パズルを解こうと努力をしてみるとわかります。 >どんなに頑張っても解くことができません。 そーだったのかー! どんなにバラバラな配列でも絶対解けると思ってた。 子供の頃、コレ得意だったんだよな。 キッチリとタイルがハマってるやつだったから、 バラバラにはできなかったけど...。
Hiro