C++向量的 2D 数组是否适合跟踪 2D 数组的动态域值?

Is a 2D array of C++ vectors suitable for keeping track of a 2D array's dynamic domain values?

本文关键字:数组 2D 动态 跟踪 向量 是否 C++      更新时间:2023-10-16

用CSP算法编写C++回溯程序,解决数独难题。

变量被映射到9X9网格(81个变量),因此程序是面向行/列的。

为了使回溯更智能,程序需要跟踪9X9网格上每个变量仍然可以接受的可能值。

(对于81个变量中的每一个,数字列表都是1-9,并且不断变化。)

我最初的想法是使用向量的2D数组来映射到每个变量。

例如,向量[1][5]将包含变量[1][5]的所有可能值。

就效率和易用性而言,这是合适的容器还是其他容器效果更好?

为此使用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。