给定一个包含81个元素的数组(意味着代表一个9x9网格),我如何遍历每个元素,抓住它周围的三个元素然后对它们执行操作,然后继续到每一行的下一个三列,或子矩阵。查看下面或在数独网格中查看布局。
define COL(n) ((n) % 9)
define ROW(n) ((n) / 9)
define SUB(n) ((n / 3) % 9)
例如,我有
int grid[81];
和
int array_x[9], array_y[9], array_s[9];
由于总共9x9网格可以分成以下9个类别,每个数组中有9个元素,我希望以三个组的形式获取每个列的元素(x轴),执行
r = ((a = ~a) & (b = ~b)) | ((b | a) & ~c);
// or
r = ((~a & ~b)) | ((~b | ~a) & ~c);
在它们上面,取三个结果数字,然后对它们执行,然后将它存储到数组中。
如果这听起来不可能,抱歉,我想采用不同的方式来做到这一点。绝对愿意接受建议......
答案 0 :(得分:1)
另一次尝试:
void applyThingy(int *grid, int xPitch, int yPitch)
{
int row, column;
int *rowPointer = grid;
for(row = 0; row < 3; ++row)
{
int *columnPointer = rowPointer;
for(column = 0; column < 3; ++column)
{
doOperation(columnPointer);
columnPointer += xPitch;
}
rowPointer += yPitch * 9;
}
}
applyThingy(&grid[SUB(n)], 1, 1); // Perform on 3x3 subgrid
applyThingy(&grid[ROW(n)], 1, 0); // Perform on row
applyThingy(&grid[COL(n)], 0, 1); // Perform on column
答案 1 :(得分:0)
我不确定你想做什么,但是它是这样的吗?:
#define IDX(row, col) ((row)*9+(col))
int m = some_column;
for (int n = 0; n < 9; n += 3) {
a = grid[IDX(n, m)];
b = grid[IDX(n+1, m)];
c = grid[IDX(n+2, m)];
r = ...;
...
}
另外,我不确定你想要做什么操作
r = ((a = ~a) & (b = ~b)) | ((b | a) & ~c);
您将~a
分配给a
,这是您想要的吗?如何定义a
,以及您要将其设置为什么?你想要实现什么目标?