部分解への分割方法の検討
ver.0.10 2010/01/24 daichinあっとexcite.co.jp
   http://hexomino.hp.infoseek.co.jp/

・Version History
 0.10 10/01/24 全面改訂 ペントミノの場合
 0.02 02/12/22 ヘキソミノの場合を追加
 0.01 02/12/17 初稿 ペントミノ場合


 自分でも当然検証を進めていきますが、ちょいと心配です。どなたか、追試、検証をしていただけませんでしょうか?ご意見、ご質問等お待ちしてます。(メールでも、掲示板でも結構です。)


ペントミノの場合

 説明に、左の例を使ってみます。特に意味のある組み合わせではなく、適当に選んだものです。
 Ver.0.02までは、組み合わせた時に重ならないパーツのリストを作成し、それらを組み合わせて、残りの空白部分を探索するという考え方でした。

 その結果、左図の水色3マスを埋める組み合わせが条件となり、薄い灰色の領域に入ります。以下の例のように、1ピースのものもあれば、3ピースからなるものまであることになります。
  

 このパーツ自体は、せいぜい3ピースの組み合せなので、全通り簡単に求まります。(何通りあるかの計算結果が掘り出せない・・・)

 これを4隅に順に組み合わせて、残りの空白部分だけを探索すれば効率的では(?)というのが基本的なアイデアでした。

 実際に実行してみると、組み合わせのほとんどは、解のない無駄なものがほとんどで、組み合わせ数は2339通りを遥かに超え、それを総当たりで探索したのでは、逆に処理時間が長くなってしまいました。

 それではということで、各パーツに対して、数手先までチェックし、解の無いものを枝刈りしたり、せっかく探索するので、その結果をデータとして保存し、その後の探索に利用するとか、いろいろ試してみたのですが、結果として高速化に繋がるような有効なアイデアが見つからず、・・・・フェードアウトしてました。

 ということで、長い前置きがやっと終わって、ここからが今回のアイデアです。

 ペントミノは全体が6x10マスなので、左図のように3x5の領域に4分割できます。
 この左上の薄緑色の領域を埋めるというのを条件にすると、左図の例のようになります。当然ですが、他の領域にはみ出してしまいますが、これでいいんです。この条件のパーツをすべて求めると、それ以上ピースの探索は一切必要ない(のではないか)というのが今回の最大のポイントです。
 では、左下の灰色の残りの部分を どうやって埋めるかなんですが、はみ出しているピースだけを残して、上下反転させると、左図になります。そうなんです、このパターンを含んだパーツは、上で求めたパーツリストの中にすでに存在するのです。

 それを見つけてくるのは、「探索」ではなく、「検索」になるというのはわかりますでしょうか?

つづく

inserted by FC2 system