我试着用一个联盟声明来描述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];
}
电路板的每个部分是否与数组的正确部分相对应?也就是说,
sec4是否与4-6板相对应?有没有更好的方法来做这类事情(特别是描述数独棋盘)?
发布于 2010-04-21 19:39:48
您可以通过将其封装在一个类中来实现您想要的效果:
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-21 19:26:21
这是行不通的,就像写的那样。
联合的行为就像其所有成员都位于距联合起始位置的偏移量0处一样。
这意味着sec9
将与sec1
具有相同的偏移量(零),因此会重叠。
我认为使用联合也不可能做到这一点,因为您需要表示在每个部分结束后需要发生特定的“跳过”,以到达该部分中的下一个单元格。您不能使用C或C++数组来做到这一点。
发布于 2010-04-21 19:46:08
答案是否定的,内存布局将不会是您所期望的。请注意,无论何时在C/C++中定义数组,内存都是连续的,因此对于9x9数组,第四个元素不是第二行的第一个元素,而是第二个3x3块的第一行的第一个元素。
您的联合的内存布局将在full
对象的9行中的每一行上都有sec
块。
https://stackoverflow.com/questions/2682408
复制相似问题