增量联盟?

时间:2010-04-21 11:24:59

标签: c++ unions

我正在尝试使用union语句描述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会与棋盘[4-6] [0-3]对应吗?有没有更好的方法来做这种事情(特别是描述数独板)?

7 个答案:

答案 0 :(得分: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];
};

但是,我不确定这是代表数独棋盘的最佳方式。你可能会发现,一旦你开始研究逻辑,你就会得到一个更好的表示。

答案 1 :(得分:1)

这不会像写的那样有用。

一个联合体的行为就像它的所有成员都在联盟的起始位置偏移0一样。

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

我认为使用联盟也不可能这样做,因为你需要表示在每个部分结束后需要发生某个“跳过”,以便进入下一个单元格部分。你不能用C或C ++数组做到这一点。

答案 2 :(得分:1)

答案是否定的,内存布局不符合您的预期。请注意,无论何时在C / C ++中定义数组,内存都是连续的,因此对于9x9数组,第4个元素不是第二行的第一个元素,而是第二个3x3块的第一行的第一个元素。 / p>

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

答案 3 :(得分:1)

每个工会成员,因此每隔sec1..sec9非常秒将在同一位置。您可以尝试在结构中包装所有部分,但它们仍然不会对应于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;

}

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

答案 4 :(得分:0)

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

答案 5 :(得分: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];
};

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

答案 6 :(得分:0)

这是行不通的,因为9 * 9电路板中的每个3 * 3区域都会占用非连续的存储器。

我所做的是:

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

其中cell_ptr填充了指向网格的指针,以便cell_ptr[0][0...80]允许迭代行,cell_ptr[1][0...80]将迭代列,cell_ptr[2][0...80]允许迭代超过3 * 3个地区。