【问题标题】:Retrieve and store elements (according to conditions) from an array从数组中检索和存储元素(根据条件)
【发布时间】:2010-10-13 01:40:03
【问题描述】:

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

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

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

【问题讨论】:

  • 需要 81 个元素的向量而不是 9x9 数组的限制是什么?

标签: c arrays copy elements sudoku


【解决方案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

【讨论】:

  • 啊,不完全是。如果我正在处理第 0 列,索引 0,我会(也)抓住该列中的下两个(恰好有索引 9 和 18)并对它们执行所述操作。对接下来的三个重复此操作,依此类推,然后继续。对于每个列和子矩阵。
  • @Sid,所以你想对每一列、每一行、每一个 3x3 数独网格执行一个通用操作?
  • @Sid,你是仅限于纯C还是可以使用C++?
  • Pure C 是首选,但如果我能从 C++ 中受益,我想被展示出来。
  • @Sid,然后看看我更新的答案。或者这不是你想要的?
【解决方案2】:

我不确定你想做什么,但是是这样的吗?:

#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 是如何定义的,你想把它设置成什么?你想达到什么目的?

【讨论】:

  • 这只是为了避免以后必须执行另一个非操作。不确定它是否有帮助。我快要放弃这个问题并尝试不同的解决方案了。
  • 虽然你的可能是我需要的。
  • 哎呀,讨厌发布这么多 cmets,但你有办法对行和我的“子矩阵”执行该操作吗?
  • 我明白了...但是我认为这个优化的加速可以忽略不计,~(...) 是一个非常快的操作。另外:你确定操作数是从左到右计算的吗?我不认为这是有保证的。最好坚持使用第二个版本,一旦一切正常,还有时间进行改进。
  • 你可以只计算“主”矩阵中的行数吗?例如,如果您的子矩阵从第 3 行开始,则它的行将位于主矩阵中的 3+0、3+1 和 3+2 处。然后只需访问这些行的主矩阵。 (列相同:如果子矩阵从 6 开始,则列是 6+0、6+1 和 6+2)
猜你喜欢
  • 2022-09-26
  • 2015-10-08
  • 2015-10-23
  • 2011-05-13
  • 2017-05-11
  • 2019-08-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多