私は最近、私がPHP内で簡単なスドクを解くことができるかどうかを見たいと思っていました。私は、PHPは本当にプログラミングの理由のためのchoiseではない知っているが、私は最高のPHPを知っていると私はJavaとCの設計に問題があった。それにもかかわらず、私はそれがうまくいかない理由は何も見ません。php easy sudokuソルバのバックトラックを使用して
最初に私はそこにいくつかの解決されたスレッドがあったので、あなたに聞きたくありませんでした。しかし、私はそれらの解決策が私の理解のために複雑すぎることを知っています(他の言語、複雑な構造化)。
私の質問は、誰かが私の目標に基づいてヒントを与えることができますか?私は推測せずに単純なスッドソルソルバーを望んでいます。
アルゴリズムは次のようになります。
$cell; // 1-81 - as parameter of the recursive function solve()
$value; // 1-9 - as parameter ...
class Sudoku {
function solve($cell = 1, $value = 1) {
// skipping values
if the current cell is fix:
return solve(cell++, $value);
// testing values (logic)
if not:
if the value is within the square (3x3) itself:
return solve($cell, $value++);
if the value is within the row:
return solve($cell, $value++);
if the value is within the col:
return solve($cell, value++);
if the value is bigger than 9:
return solve($cell--, $value_prev);
// all test passed, add the new value to list
$this->values[$cell] = $value;
if all fields are filled:
return;
if there are fields left:
return solve($cell++, 1);
}
}
私は空白の数独を作成する場合、スクリプトが致命的なエラーでクラッシュがあり、セル43まで、それはすべて正常にいっぱいになります:致命的なエラー:134217728の許可メモリサイズバイトが枯渇しました(261904バイトを割り当てようとしました)。
値は次のように充填されています
1 2 3 | 4 5 6 | 7 8 9
4 5 6 | 7 8 9 | 1 2 3
7 8 9 | 1 2 3 | 4 5 6
2 1 4 | 3 6 5 | 8 9 7
3 6 5 | 2 1 4 | 。 。 。
このクラッシュの原因となる無限ループなどがあります。多分このように解決できないかもしれません。私はちょうど私が正しいことをしているのか、私がチェックするのを忘れていたのかを知りたかった。 私はeasy-sudokuの固定値でこのアルゴリズムを試しました。それはあまりにもクラッシュする...多分バックトラックすることがあります。
最後に、私はより良い解決策に反対していないと言いたいと思いますが、これを機能させたいだけです。 あなたが私にこれに基づいて答えを与えることができない場合は、PHPファイルを見て持つことができます。
編集:事前に sudoku2.php
感謝を。
まだ動作していません。しかし、私はシステムがクラッシュするのを防ぐことができます。いいえ、私はいつもメッセージを得る: "このスドクを解決することはできません"。私はあなたが言ったようにしたと思います。あなたは上記のソースコードを見ているかもしれませんか? "sudoku2.php"。 –
これで動作します...以前のセルにバックトラックする前にセルの値を0にリセットするのを忘れました。それはトリックです。 –