【问题标题】:Is a 2D array of C++ vectors suitable for keeping track of a 2D array's dynamic domain values?C++ 向量的二维数组是否适合跟踪二维数组的动态域值?
【发布时间】:2014-03-02 21:48:12
【问题描述】:

编写 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] 将包含 variable[1][5] 的所有可能值。

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

【问题讨论】:

  • 对这个任务使用向量听起来有点过分了。如果您只在数字 1-9 之后,为什么不使用vector[1][5] 作为位图?换句话说,将vector 设为一个二维整数数组,并使用每个位置作为位图来跟踪您尝试过/需要尝试的数字。
  • @filipe-goncalves:好吧,这听起来是一种有效的方法,所以如果我想从变量域中删除 5,我会 AND 它是 int 值等于 111101111 的域值?
  • 看我的回答,我展示了一个可能的实现。

标签: c++ arrays windows oop vector


【解决方案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 &lt;&lt; v)。 next_value() 将为您提供下一个值来测试按升序排序的位置 [x,y],如果 1-9 范围内的每个值都已经过测试,则为 10。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-02
    • 2011-01-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多