C ++使用列表来解决数独

时间:2013-06-17 12:49:50

标签: c++ arrays list sudoku solver

我试图用c ++编写一个数独求解器。我希望从[9]中保留一个数组[9](显然)。我现在正在找出一种跟踪可能值的方法。我想到了数组中每个条目的列表。所以列表最初的数字是1到9,每次迭代我都能摆脱一些值。

现在我的问题是,我可以为2D数组中的每个条目分配一个列表,如果是这样的话?还有其他/更好的选择吗?

我是一名初级程序员,这基本上是我在c ++中的第一个项目。 提前致谢!

3 个答案:

答案 0 :(得分:0)

你可以通过

创建一组数组
std::array<std::set<int>,81> possibleValues;
例如,

。您可以通过编写

来填充此数组
const auto allPossible = std::set<int>{ 0, 1, 2, 3, 4, 5, 6, 7, 8 };
std::fill( std::begin(possibleValues), std::end(possibleValues), 
    allPossible );

如果您使用的是现代C ++ 11编译器。这是您设置/清除和测试每个条目的方法:

possibleValues[x+9*y].insert( n ); // sets that n is possible at (x,y).
possibleValues[x+9*y].erase( n ); // clears the possibility of having n at (x,y).
possibleValues[x+9*y].count( n ) != 0 // tells, if n is possible at (x,y).

如果性能存在问题,您可能希望使用位操作而不是(相对)重量级std::set操作。在这种情况下使用

std::array<short, 81> possibleValues;
std::fill( begin(possibleValues), end(possibleValues), (1<<10)-1 );

字段n的值(x,y)是可能的,当且仅当possibleValues[x+9*y] & (1<<n) != 0,其中所有索引在这种情况下从0开始。

答案 1 :(得分:0)

一个简单的解决方案是为每个方块使用一组一位标志,例如

uint16_t board[9][9]; // 16 x 1 bit flags for each square where 9 bits are used
                      // to represent possible values for the square

然后,您可以使用按位运算符来设置/清除/测试每个位,例如

board[i][j] |= (1 << n);  // set bit n at board position i, j

board[i][j] &= ~(1 << n); // clear bit n at board position i, j

test = (board[i][j] & (1 << n)) != 0; // test bit n at board position i, j

答案 2 :(得分:0)

您可以随时将您的数独视为3D数组,使您的3D维度存储可能的值,主要是:

// set "1" in cell's which index corespond to a possible value for the Sudoku cell
for (int x = 0; x < 9; x++)
    for (int y = 0; y < 9; y++)
        for (int i = 1; i < 10; i++)
            arr[x][y][i] = 1;

arr[x][y][0]包含您数独的价值。

要删除例如“5”的值作为单元格[x][y]的可能性,只需更改arr[x][y][5] = 0的值