将C ++ backtracking with CSP algorithm程序编写到solve a Sudoku puzzle。
变量映射到9X9网格(81个变量),so the program is row/column oriented。
为了使回溯变得更加智能,程序需要跟踪9X9网格上每个变量仍然可以接受的可能值。
(81个变量中的每个变量的数字列表为1 - 9,并且不断变化。)
我最初的想法是使用 2D 向量数组 - 映射到每个变量。
例如,vector [1] [5]将包含变量[1] [5]的所有可能值。
在效率和易用性方面 - 这是正确的容器还是其他更好用的东西?
答案 0 :(得分:1)
使用std::vector
听起来不必要且过度杀伤。既然您知道变量的确切域,并且它只是数字1-9,我建议使用二维数组,其中每个位置都用作位图。
代码示例(未经测试):
short vector[9][9] = { 0 };
/* v must be in the range [1-9] */
void remove_value(int x, int y, int v) {
vec[x][y] |= 1 << v;
}
int test_value(int x, int y, int v) {
return (vec[x][y] & (1 << v));
}
int next_value(int x, int y) {
int res = 1;
for (int mask = 2;
mask != (1 << 10) && (vector[x][y] & mask);
mask <<= 1, res++)
; /* Intentionally left blank */
return res;
}
将vector[x][y]
视为初始化为0的二进制整数:
...0000000000
意思是将i
设置为1意味着您已经测试了数字i
,否则,您尚未对其进行测试。像往常一样,位计数从右到左,从0开始。您将只使用位1到9。
remove_value()
(即从域中删除此值),test_value()
可用于检查v
是否曾经已经过测试 - 如果尚未使用v
,它将返回0,否则将返回0(确切地说,1 << v
)。 next_value()
将为您提供下一个值来测试按升序排序的位置[x,y],如果已经测试了1-9范围内的每个值,则为10。