扫描镜像和旋转的二维阵列

时间:2018-05-09 17:05:20

标签: arrays

我需要扫描一个矩形的二维数组。通常,我会在y和x上使用嵌套循环。但是,我还想以旋转和/或镜像方式扫描阵列。天真地,这将导致2 * 4 = 8个嵌套循环,我想避免。

我如何优雅地实施所有8个案例?

这就是我提出的:

int sx = 3;
int sy = 2;
var a = new int [,] {
    { 1, 2, 3 },
    { 4, 5, 6 },
};

for (int order = 0; order < 8; order++) {
    var mirrorX = (order & 1) != 0;
    var mirrorY = (order & 2) != 0;
    var mirrorDiag = (order & 4) != 0;

    for (int i = 0; i < sx * sy; i++) {
        int x = mirrorDiag ? i % sx : i / sy;
        int y = mirrorDiag ? i / sx : i % sy;
        if (mirrorX) {
            x = sx - x - 1;
        }
        if (mirrorY) {
            y = sy - y - 1;
        }
        Console.Write (a [y, x]);
    }
    Console.WriteLine ();
}
  

142536
  362514个
  415263个
  635241个
  123456个
  321654个
  456123个
  654321

1 个答案:

答案 0 :(得分:0)

我建议您将此任务分为两部分:

  1. 为每个创建Deque。在您的示例中,您将拥有2个水平队列和3个垂直队列。
  2. 现在您拥有所需的新数据,请创建遍历这些队列的8个独立函数(即策略)。