2

我试图用联合声明来描述 C++ 中的数独板:

union Board
{
    int board[9][9];
    int sec1[3][3];
    int sec2[3][3];
    int sec3[3][3];
    int sec4[3][3];
    int sec5[3][3];
    int sec6[3][3];
    int sec7[3][3];
    int sec8[3][3];
    int sec9[3][3];     
}

电路板的每个部分是否与阵列的正确部分相对应?IE,

sec4 会与 board[4-6][0-3] 对应吗?有没有更好的方法来做这种事情(特别是描述数独板)?

4

7 回答 7

5

您可以通过将其封装在一个类中来实现您想要的效果:

class Board {
public:
    int& sec1(int r, int c) { return board[r][c]); }
    int& sec2(int r, int c) { return board[r][c+3]; }
    // etc.

private:
    int board[9][9];
};

但是,我不确定这是代表数独板的最佳方式。您可能会发现,一旦开始研究逻辑,您就会提出更好的表示。

于 2010-04-21T11:39:47.530 回答
1

正如所写,这将不起作用。

联合的行为就好像它的所有成员都在联合起点的偏移量 0 处。

这意味着sec9将具有与 相同的偏移量(零)sec1,因此重叠。

我认为也不可能使用联合来做到这一点,因为您需要表示在每个部分结束后需要进行一定的“跳过”,才能到达该部分的下一个单元格。您不能使用 C 或 C++ 数组来做到这一点。

于 2010-04-21T11:26:21.253 回答
1

答案是否定的,内存布局不会是你所期望的。请注意,每当您在 C/C++ 中定义数组时,内存都是连续的,因此对于 9x9 数组,第 4 个元素不是第二行的第一个元素,而是第二个 3x3 块的第一行的第一个元素。

您的联合的内存布局将在对象sec的 9 行中的每一行上都有块。full

于 2010-04-21T11:46:07.947 回答
1

每个联合成员,因此每个 sec1..sec9 非常 sec 都将位于同一位置。您可以尝试将所有教派包装在一个结构中,但它们仍然不会对应于 3x3 正方形,而是原始结构中的 9*1 行:

union Board
{
    int board[9][9];
    struct {
        int sec1[3][3];
        int sec2[3][3];
        int sec3[3][3];
        int sec4[3][3];
        int sec5[3][3];
        int sec6[3][3];
        int sec7[3][3];
        int sec8[3][3];
        int sec9[3][3];     
    } sects;

}

总而言之,真正的课堂将是最好的方法。

于 2010-04-21T12:04:48.667 回答
0

您不会纯粹使用 C++ 语言功能来解决这个问题 - 您需要考虑解决问题所需的数据结构和对该结构的操作 - 换句话说,您需要设计一个类(或更可能是几个类) . 这是编程的有趣部分,所以我不打算提出解决方案。

于 2010-04-21T11:30:34.967 回答
0

另一种解决方案(除了 Ferruccio 提出的解决方案)可能是定义 3 个指向 int 的指针的数组 - 每个部分一个,并在构造函数中相应地初始化这些数组。

class Board {
public:
    int *sec1[3]; // sec1[0] = &(board[0][0]), sec1[1] = &(board[1][0]),sec1[2] = &(board[2][0])
    ...

    int board[9][9];
};

但坦率地说,访问方法可能要好得多。

于 2010-04-21T11:56:08.440 回答
0

那是行不通的,因为 9 * 9 板上的每个 3 * 3 区域无论如何都会占用不连续的内存。

我所做的是:

Cell grid[9][9];
Cell* cell_ptr[3][81]; //0 = by rows; 1 = by columns; 2 = by box

wherecell_ptr填充了指向网格的指针,以便cell_ptr[0][0...80]允许迭代行,cell_ptr[1][0...80]将迭代列,并cell_ptr[2][0...80]允许迭代 3 * 3 区域。

于 2010-04-21T14:31:35.317 回答