ルール
-
RULE 01
父は、母がいないと娘を殺す。母のいない岸に父と娘(どちらか一方でも)を残してはいけません。
-
RULE 02
母は、父がいないと息子を殺す。父のいない岸に母と息子(どちらか一方でも)を残してはいけません。
-
RULE 03
犬は、召使いがいないと家族全員を殺す。召使いのいない岸に、犬と家族の誰かを残してはいけません。犬と召使いだけなら安全です。
-
RULE 04
舟は定員2名。舟を漕げるのは父・母・召使いの3人だけ。行きも帰りも、必ずこの誰かが乗っている必要があります。
遊び方
- 1.舟のある側の岸から、人物をタップ(クリック)して舟に乗せる。もう一度タップすると降ります。
- 2.操縦できる人物(枠が朱色の父・母・召使い)が乗っていれば「渡る」ボタンが押せます。
- 3.「渡る」で舟が対岸へ。舟に乗り込んだ人はもう岸にはいない扱いになり、渡った瞬間に両岸の安全が判定されます。
- 4.ルールを破ると「事件」になります。その場で「1手戻す」か「最初から」を選べるので、気軽に試して構いません。
最短手数について
このパズルは17回の渡河で解けます。そしてこれが理論上の最短です。
全状態を幅優先探索して確かめたので、16手以下の解は存在しません。8人の配置(2の8乗=256通り)と舟の位置の組み合わせ、計512状態のうち、ルールを満たすものだけを辿った結果です。
実装メモ
- ルール判定:「岸にいる人物の集合」を受け取って違反を返す純粋関数を1つだけ用意し、ゲーム本体とヒント用ソルバの両方がそれを使っています。判定基準が二重にならないので、ルールを変えたい時も1か所で済みます。
- ソルバ:8人の配置をビットマスク、舟の位置を1ビットで表し、512状態を幅優先探索。ブラウザ上で一瞬で解けます。
- アニメーション:人物の乗り降りはFLIP(移動前後の座標を測って差分を打ち消してから戻す手法)で処理。DOM上は要素を岸のコンテナから舟のコンテナへ移し替えるだけなので、内部状態と画面表示がずれません。
- キャラクター:SVGのシルエット。大人と子供は背丈、性別はスカートとズボン、召使いはエプロンと蝶ネクタイで描き分けています。舟を漕げる3人は枠を朱色にしました。
- その他:キーボードだけで最後まで遊べます。読み上げ用のライブリージョン、OSの「視差効果を減らす」設定への対応、自己ベストのローカル保存も入れてあります。
元ネタ
「猛獣家族の川渡り」「嫉妬深い夫たち」などの名前で知られる古典的な川渡りパズルの一種です。
オオカミ・ヤギ・キャベツの3つを渡す有名な問題の拡張版にあたり、登場人物が8人まで増え、漕ぎ手が限られることで一気に難しくなります。