哪个数据结构代表数独谜题,并通过查找裸单/隐藏单个来解决它

时间:2011-12-21 10:10:47

标签: c# .net algorithm data-structures sudoku

为了通过使用裸单隐藏单技术来解决它,我对以下两个数据结构中的哪一个应该用于表示数独板而犹豫不决

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];

通过这种方式,我们可以通过检查candidates[row, col, n]是真还是假来检查单元格(row,col)是否包含候选n

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

通过这种方式,我们可以通过检查表达式row[r, n] && col[c, n] && square3x3[r/3 * 3 + c/3, n]是真还是假来检查单元格(r,c)是否包含候选n

当某个单元格用数字n求解时,在第一种方式中,我们必须更新某个单元格的row,col,square3x3中所有3x9单元格的候选者,而在第二种方式中,我们只需要设置行[,n ],col [,n]和square3x3 [,n]为真。

但我不确定找到裸单和隐藏单身的哪种方式是合适而有效的。

有人可以建议我找一个隐藏的单一算法吗?

帮助我,谢谢!

2 个答案:

答案 0 :(得分:0)

我个人不会使用一组你必须保持同步的基本数组,而是一个Board类。

这将在内部有一个9x9的Field项数组,它将包含一个可选的(int?)给定数字,一个可选的派生数字和一个候选列表(bool[9])。

此类将公开一些属性/方法以获取特定单元格或行/列/块。

答案 1 :(得分:-1)

当我自己解决数独游戏时,我只使用了两个多维数组。

一个包含该字段的当前状态(单元格是数字),另一个包含可能的下一个字段状态(单元格是数字数组)。

你可以从我的代码中获得一些想法(但它在Ruby中)

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