1

给定一个包含 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);

在它们上,取三个结果数,并对它们执行,然后将其存储到数组中。

如果这听起来不可能,对不起,我想要一种不同的方式来做到这一点。绝对开放的建议...

4

2 回答 2

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
于 2009-03-13T01:00:36.573 回答
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);

你分配~aa,这是你想要的吗?如何a定义,您想将其设置为什么?你想达到什么目的?

于 2009-03-13T01:39:00.287 回答