我正在尝试使用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]对应吗?有没有更好的方法来做这种事情(特别是描述数独板)?
答案 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个地区。