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

时间:2014-03-02 21:48:13

标签: c++ arrays windows oop vector

将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]的所有可能值。

在效率和易用性方面 - 这是正确的容器还是其他更好用的东西?

1 个答案:

答案 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。