特定の数独パズルを解くアルゴリズムを PHP で作成しています。Square
9x9 ボード上の個々のタイルごとのクラスと、ボードを表す s のSudoku
マトリックスを持つクラスの 2 つのクラスを使用して、ややオブジェクト指向の実装をセットアップしました。Square
私が使用しているアルゴリズムの実装は、一種の 3 層アプローチです。最初のステップは、最も基本的なパズルのみを解決します (ただし、最も効率的です)。ボードの初期設定に基づいて単一の値しか取り得ない正方形を埋め、残りの部分に応じて制約を調整します。未解決の正方形。
通常、この「一定の伝播」のプロセスはボードを完全には解決しませんが、かなりの部分を解決します。次に、2 番目の層が開始されます。これは、未解決の各正方形の「可能な」値について、各ユニット (または行または列などの一意の番号割り当てが必要な 9 つの正方形) を解析します。Square
この可能な値のリストは、クラスの文字列として表されます。
class Square {
private $name; // 00, 01, 02, ... , 86, 87, 88
private $peers; // All squares in same row, col, and box
private $number; // Assigned value (0 if not assigned)
private $possibles; // String of possible numbers (1-9)
public function __construct($name, $p = 0) {
$this->name = $name;
$this->setNumber($p);
if ($p == 0) {
$this->possibles = "123456789";
}
}
// ... other functions
(上記の第 2 層で説明したように) ユニット内の未解決の正方形の配列全体が与えられると、第 2 層は「可能性」のすべての文字列を単一の文字列に連結します。次に、その単一の文字列を検索して、一意の文字値 (繰り返されない値) を探します。これは、正方形の単位内で、その特定の値を取ることができる正方形が 1 つしかないことを示します。
私の質問は、この第 2 層を実装するために、ユニット内のすべての可能な値のこの文字列を解析し、一意の値を簡単に検出するにはどうすればよいですか? 各インデックスが 1 ~ 9 の数字で表される配列を作成できることはわかっています。また、見つかったその数字の可能な値ごとに、対応するインデックスの値を 1 ずつ増やしてから、配列を再度スキャンして、値は 1 ですが、これは非常に非効率的で、各ユニットに対して配列の 2 つの線形スキャンが必要であり、数独パズルでは 27 個のユニットがあります。