0

裸のシングル隠されたシングルのテクニックを使ってそれを解決するために、次の2つのデータ構造のどちらを数独ボードを表すために使用するべきかについて私は躊躇しています。

1.1。

//using bool array to store candidates of a cell.
int[,] board = new int[9,9];
bool[,] isFixed = new bool[9,9]; // determine cell is fixed.
bool[,,] candidates = new bool[9,9,9];

このようにして、セル(row、col)に候補nが含まれているかどうかを確認するには、どちらcandidates[row, col, n]が真か偽かを確認します。

2.2。

int[,] board = new int[9,9];
bool[,] isFixed = new bool[9,9]; // determine cell is fixed.
bool[,] row = new bool[9,9]; //row(1,2) = true means number 2 was already appear (is solved or fixed) in 1st row
bool[,] col = new bool[9,9]; //col(1,2) = true means number 2 was already appear (is solved or fixed) in 1st col
bool[,] square3x3 = new bool[9,9]; //square3x3 (1,2) = true means number 2 was already appear (is solved or fixed) in 1st square3x3

このように、セル(r、c)に候補nが含まれているかどうかを確認するには、式row[r, n] && col[c, n] && square3x3[r/3 * 3 + c/3, n]が真か偽かを確認します。

特定のセルが番号nで解決される場合、第1の方法では、特定のセルの行、列、square3x3のすべての3x9セルの候補を更新する必要がありますが、第2の方法では、row [、n]、colのみを設定します。 [、n]およびsquare3x3 [、n]をtrueに設定します。

しかし、裸のシングルと隠されたシングルを見つけるのにどちらの方法が適切かつ効率的かはわかりません。

誰かが私に隠されたシングルを見つけるためのアルゴリズムを提案できますか?

助けてくれてありがとう!

4

2 に答える 2

0

個人的には、同期を維持する必要がある一連の基本的な配列ではなく、Board クラスを使用します。

これは、フィールド項目の 9x9 配列を内部的に持ち、オプション ( int?) の与えられた番号、オプションの派生番号、およびbool[9]候補のリスト ( ) を保持します。

このクラスは、特定のセルまたは行/列/ブロックを取得するためのいくつかのプロパティ/メソッドを公開します。

于 2011-12-21T10:20:29.673 に答える
-1

私が数独を自分で解いていたとき、私はたった2つの多次元配列で逃げました。

1つはフィールドの現在の状態(セルは数値)を含み、もう1つはフィールドの次の状態(セルは数値の配列)である可能性があります。

あなたはおそらく私のコードからいくつかのアイデアを得ることができます(それはRubyにありますが)

https://github.com/stulentsev/sudoku-solver/blob/master/solver.rb

于 2011-12-21T10:16:26.547 に答える