KenKen パズルは、エッジが接続されたドメインに分割されたラテン方陣です。1 つのセル、同じ行または列内の 2 つの隣接するセル、行またはエルに配置された 3 つのセルなどです。各ドメインには、ターゲットを与えるラベルがあります。数値と、ドメインのセル内の数値に適用してターゲット数値を生成する単一の算術演算 (+-*/)。(ドメインにセルが 1 つしかない場合、演算子は指定されず、ターゲットだけが指定されます --- 正方形は自動的に解決されます。演算子が - または / の場合、ドメインにはセルが 2 つしかありません。)パズルは、ドメインの境界とラベルと一致するラテン方陣を (再) 構築することです。(解が一意ではないパズルを一度だけ見たことがあると思います。)
セル内の数値は、1 からパズルの幅 (高さ) までの範囲で指定できます。通常、パズルは 1 辺が 4 または 6 セルですが、任意のサイズのパズルを検討してください。公開されたパズル (4x4 または 6x6) のドメインは、通常 5 つ以下のセルしかありませんが、これも厳しい制限ではないようです。(ただし、パズルのドメインが 1 つだけの場合、その次元のラテン方陣と同じ数の解が存在することになります...)
KenKen ソルバーを作成するための最初のステップは、最初はドメインのジオメトリを無視して、任意のドメインで可能な数値の組み合わせを生成できるルーチンを用意することです。(3 つのセルの行のような線形ドメインは、解決されたパズルで重複した数字を持つことはできませんが、当面はこれを無視します。) ケースバイケースで加算ラベルを処理する Python 関数を作成できました。パズルの幅、ドメイン内のセルの数、およびターゲットの合計であり、ターゲットに加算される有効な数値のタプルのリストを返します。
乗算のケースは私を避けます。与えられたサイズのパズルで与えられたサイズのドメインで達成可能な製品に等しいキーを持つ辞書を取得できます。値は、製品を与える要因を含むタプルのリストです。しかし、ケースを解決することはできません-ケースバイケースのルーチンであり、悪いものでもありません。
与えられた積を素数に因数分解するのは簡単に思えますが、素数のリストを必要な数の因数に分割することは私を困惑させます。(私は Knuth の TAOCP の Volume 4 の Fascicle 3 について熟考しましたが、彼のアルゴリズムの説明を「理解する」方法を学んでいないので、集合分割のための彼のアルゴリズムが出発点になるかどうかはわかりません。Knuth の説明を理解することは、別の質問!)
一般的なドメインとパズルのサイズの「乗算」辞書を事前に計算し、ロード時間をオーバーヘッドまでチョークするだけで十分ですが、そのアプローチは、たとえば、100 個のセルを片側にパズルし、サイズが 2 ~ 50 セルのドメイン。