月刊「現代数学」数学パズルにトドメをさす?! 今月のFlash
第31回
2013年 4月号
向こう岸へ渡れ!(その1) 〜面倒な乗客たち〜
川渡り問題の汎用ソルバーを作る
Adobe Flash Player を取得

目的・概要

様々な制約のもと、一隻の2人乗りの舟だけで全員を対岸に渡す手順を考える、典型的な川渡り問題について、制約エディターから設定を入力して汎用ソルバーで解いてみましょう。本編記事で紹介した問題のうちのいくつかは制約データがプリセットされており、ソルバーを使わずパズルとして楽しむこともできます。さらに、設定された条件は「設定コード」文字列として保存できるので、自分だけのオリジナル問題を作って情報交換もできます。

最初に表示されるのは、本編「問題4」を実際に解くゲーム画面で、右上に当該問題の制約一覧が、右下にこの問題を再現するための設定コードが表示されています。「ルールを変更」ボタンで条件編集モードに入れます。

本ツールで扱う問題

ここで扱う問題は、3人から10人までの登場人物(物や動物も含む)が、2人乗りの舟1隻だけで川をこちら側から対岸まで渡る手順を探す問題で、1回の操作毎に舟に乗っていた人物は一旦舟から降りてその岸にいる者全員が顔を合わせるものとします。その前提のもと,問題毎に以下のような条件が設定されます。

漕手条件

登場人物のうち,舟の漕ぎ手となれる人物の集合が指定されます。実際にはその人が漕ぐかどうかではなく,その集合の中の人が1人でも含まれていない限り舟は動かないというような集合を指定します。なお,漕手条件は後述する船上での禁止条件としても表せるので,たとえば「大人は1人でも漕ぐことができるが,子供だけでは2人いないと漕げない」というようなより複雑な条件の場合は,漕手条件としては全員を指定しておき,船上では子供は1人にはなれないというような条件を別途指定することで表現できます。

禁止条件

登場人物全体の集合の,交わりを持たない2つの部分集合P,Qを指定し,Pに属する者は全て含まれ,Qに属する者はだれも含まれないような集団が両岸もしくは船上に出現することを禁止するという条件です。例えば,「キツネは農夫がいないとガチョウを食べてしまう」という設定の場合,P={キツネ, ガチョウ},Q={農夫}を指定します。また,「A〜D4人のうちAとBを2人きりにするとケンカを始めてしまう」という設定の場合は,P={A,B},Q={C,D}を指定すればよいことになります。このツールでは,各禁止条件の集合Pに含まれるメンバーのことを「トラブルメーカー」,Qに含まれるメンバーのことを「ストッパー」(トラブルを抑止する者という意味で)と呼んでいます。

先のP={A,B},Q={C,D}の場合,AもBも含まれ,CもDも含まれない場合のみNGとなるので,AとBが同時にいても,CかDのどちらかがいればトラブルは回避されます。逆に,AとBが同時にいる場合にCもDも揃っていないとケンカを止められないならば,P={A,B},Q={C}という禁止条件とP={A,B},Q={D}という禁止条件を2つ指定する必要があります。

本ツールでは,一般の禁止条件に加え,船上のみ,もしくは陸上のみに適用される禁止条件も用意されており,より柔軟な条件設定に対応できます。

パズルモードについて

設定した条件,もしくは,プリセットの問題について,実際に人を動かして川渡りに挑戦することができます。初期状態では,記事本編問題4の条件が設定されたパズルモードになっています。現在設定されている条件は,右上の条件一覧で確認できます。

操作方法

舟のある側の岸にいる人物のアイコンをクリックすると,舟に乗せる/降ろすことができます。現在乗っているメンバーで舟を動かしてもルールに抵触しない場合のみ「移動」のボタンが出現するので,クリックで舟が移動し,対岸で乗客は降ります。

「ヒント」をクリックすると,現在の状態から最短の移動回数で渡りきる手順の1つにおける次に舟に乗るべき人物が自動的に乗船します。ただし,最短手順は1通りとは限らないので,既に乗っている組合せでもそこからの最短移動が実現できる場合は,「そのままでOK」と表示され,乗客の入れ替えは起こりません。

「ヒント」と「移動」を交互にクリックすることで,最短移動手順の1つを観察できます。「解答例を表示」をクリックすると,最短移動手順の1つを一覧として表示します。

他のプリセット問題を試す場合や,設定を変更,もしくはオリジナルの設定を入力する場合は,「ルールを変更」をクリックして,条件編集モードに入ります。

なお,現在設定されている条件では解が存在しない場合は,「解なし」と表示され,パズルモードは動作しません。条件編集モードで条件を修正して下さい。

条件編集モードについて

条件編集モードでは,問題条件の変更や,プリセットデータの呼び出し,設定コードの読み込みを行います。

設定の編集は主に左側の画面で行われ,その情報が表示されている箇所をクリックすると編集状態になります。右下にオンマウスによるナビゲーションが表示されるので,参考にして下さい。右上には現在の設定が一覧で表示されています。

各種情報の編集中に「キャンセル」をクリックすると,変更せずにメイン画面に戻ります。

設定できる情報と設定方法

問題タイトル

左上の欄をクリックしてから枠内に入力します。10文字を超えた場合は先頭11文字目以降は無視されます。

登場人物の数

中央上の欄をクリックしてから枠内に人数を入力します(3〜10)。人数を増やす場合は,既に入力されている禁止条件や漕手条件は保持されますが,人数を減らす場合は減らされる人物に関連した禁止条件は削除されます。また,減らした結果漕ぎ手がいなくなる場合は,漕手条件が「全員が漕ぎ手」の状態に初期化されます。

名前

左の表の名前の欄をクリックすると,全員の名前が編集できます。名前は3文字以内で,4文字目以降は無視されます。

漕手条件

表の左端の欄をクリックすると,漕手条件編集画面に入ります。名前をクリックすると,漕ぎ手の集合に含める/含めないが切り替わります。一人も漕ぎ手がいない状態で,編集を終了することはできません。

単純禁止条件

「トラブルメーカー」が2人の組合せ,もしくは1人だけであるような禁止条件については,単純禁止条件として,マトリックス上で編集できます。マトリックスの白い欄がトラブルメーカーの組合せに対応しており,その行と列に記された名前が「トラブルメーカー」です。(対角線上は,1人に対する禁止条件となっています。)その欄が空欄の場合は,その組合せに禁止条件が設定されていないことを表し,「●」は1つの禁止条件が,「複」は複数の禁止条件が設定されていることを示します。「●」の欄にマウスを乗せると,右下のナビに設定されている禁止条件の内訳が表示されます。

空欄のマスもしくは「●」のマスをクリックすると,その「トラブルメーカー」の組合せに対応する禁止条件の新規設定ないし変更を行えます。通常禁止条件か船上/陸上の区別,および,ストッパーの集合をその画面で設定します。なお,「●」の場合は,ここでできるのは変更と条件の削除だけで,同じ組合せに対して複数の条件を設定する場合は全タイプ禁止条件編集ボタンから行います。

「複」の欄をクリックすると,そこに設定されている複数の禁止条件の内訳が表示されます。そこでは,それらを全て削除することのみ可能で,個別の編集は全タイプ禁止条件編集ボタンから行います。

全タイプの禁止条件

「禁止条件設定/変更/削除(全タイプ)」のボタンからは,ルール一覧にある全ての禁止条件を編集できます。ルール番号を入力すると,そのルールの変更/削除が,入力せずにクリックすると新規条件の設定が可能となります。

新規作成/編集時には,通常/船上/陸上の区別と,各登場人物がトラブルメーカー/ストッパーの集合に含まれるかどうかを設定します。

トラブルメーカーもストッパーも一部の例外を除き,必ず1人以上設定する必要があります。例外的に許されるのは,船上でトラブルメーカーが2人(以上)いてストッパーがいないルールだけです。

条件の初期化

全条件削除

全ての禁止条件を削除し,漕手条件を「全員が漕ぎ手」に初期化します。

全設定削除

全条件削除に加え,タイトルと登場人物の名前も初期化します。(名前はA〜Jとなります。)

プリセットデータの利用

「設定済み条件使用」の欄のボタンから,4種類のプリセットデータを呼び出すことができます。用意されているのは,本編記事で紹介したうちの,問題1・問題2・問題4・問題6に相当する設定です。

設定コードの利用

条件編集モード/パズルモードを問わず,現在設定されている条件は,「設定コード」という文字列に変換されて右下の欄に表示されています。この文字列をコピーしてテキストファイルなどに保存しておくと,その設定を次回もしくは別の人により再利用することができます。(ファミコン世代の方であれば,「復活の呪文」に相当するものだと言えば分かりやすいかと思います。)

保存しておいた設定コードを利用する際は,右下の「設定コード入力」をクリックし,表示窓内にコードをペーストして読み込むだけです。タイトルや名前も含め全ての設定が再現されます。

設定された条件の検証

「この設定で実行」をクリックすると,設定された条件のままパズルモードに移行し,その際にソルバーが自動的に解のある問題かどうかを判定します。解答例もパズルモードで確認して下さい。

設定コードサンプル

プリセットされている設定は本編記事の問題1・問題2・問題4・問題6だけですが,他の4問についても設定コードを用意しましたので,ご利用ください。

下の一覧のカギカッコの中だけを入力して下さい。問題3と問題5については,表示の都合上途中スペースで区切っています(ブラウザ上では改行されていると思います)が,Flashでの読み込み時にスペースや改行は全て削除するので,そのままコピー&ペーストして大丈夫だと思われます。

なお,日本語環境の違いによりタイトルやキャラクター名が文字化けする可能性があるかどうかは検証していません。条件そのものは無事だと思われますので,万一文字化けがあれば,その部分だけ編集してご利用下さい。

問題3:「Yu6zpc7zMG6zwq3zTA5zfRazVp3zTA5ziG8Z6ZYu6zh8iZYu6zi8iZYu6zj8iZfRazh8 iZfRazi8iZfRazj8iZ31ZE6Zx6Zf6ZKeZEeZleZrhZlhZ3hZThZBiZ6i」

問題5:「i8izTA5zDq3zHO5zci7zyq3zLX6znj6Z8Zx8izh8iZx8izi8iZx8izj8iZy8izh8iZy8 izi8iZy8izj8iZLX6zA8iZLX6zB8iZf4ZuQ4ZoQ4Z6Q4Z6EZNGZTOZuo2ZBo2ZTo2ZiC3ZBy3 Zuq3Zc23ZBq5ZTn5ZNf5Zuq5ZNn5ZHf5Zcq5Zun5Zof5」

問題7:「TKazDG5zyq3zk8izTA5Z4Zx8iZy8iZA8iZB8iZ7ZW3Zo3」

問題8:「i8izTA5zDq3zqDazHW5Z4Zx8iZy8iZA8iZB8iZfZvZCZp1Zv1ZO1」