裸のシングルと隠されたシングルのテクニックを使ってそれを解決するために、次の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に設定します。
しかし、裸のシングルと隠されたシングルを見つけるのにどちらの方法が適切かつ効率的かはわかりません。
誰かが私に隠されたシングルを見つけるためのアルゴリズムを提案できますか?
助けてくれてありがとう!