我试图用c ++编写一个数独求解器。我希望从[9]中保留一个数组[9](显然)。我现在正在找出一种跟踪可能值的方法。我想到了数组中每个条目的列表。所以列表最初的数字是1到9,每次迭代我都能摆脱一些值。
现在我的问题是,我可以为2D数组中的每个条目分配一个列表,如果是这样的话?还有其他/更好的选择吗?
我是一名初级程序员,这基本上是我在c ++中的第一个项目。 提前致谢!
答案 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
的值