生成钻石周边的所有点

时间:2017-04-01 04:00:54

标签: language-agnostic geometry coordinates

鉴于这样的一系列钻石:

enter image description here

如何生成每颗钻石的黑色方块列表?假设红色方块位于{0,0},并且相对于该方位给出黑色方块的坐标。给定钻石的例子:

0 = {0, 0}
1 = {-1, 0}, {0, -1}, {0, 1}, {1, 0}
2 = {-2, 0}, {-1, -1}, {-1, 1}, {0, -2}, {0, 2}, {1, -1}, {1, 1}, {2, 0}
3 = {-3, 0}, {-2, -1}, {-2, 1}, {-1, -2}, {-1, 2}, {0, -3}, {0, 3}, {1, -2}, {1, 2}, {2, -1}, {2, 1}, {3, 0}

观察(给定n是从原点到角落的距离):

  • 每个坐标对的总和始终为n或-n。
  • 除0外,列表的大小始终为4n。
  • | X | + | y | = n是钻石的笛卡尔方程。

通过lattermost观察,我在C中发现了以下解决方案。但是在O(n ^ 2)时间内进行比较并且两次调用abs()。是否有更快的解决方案适合更大的钻石?

void diamond_points(int n) {
    for (int x = -n; x <= n; ++x) {
        for (int y = -n; y <= n; ++y) {
            if (abs(x) + abs(y) == n) {
                printf("{%d, %d}, ", x, y);
            }
        }
    }
}

1 个答案:

答案 0 :(得分:2)

有O(N)

for(int x = -n; x <= n; x++) {
    int y = n - abs(x);
    printf("{%d, %d}, ", x, y);
    if(y > 0) {
        printf("{%d, %d}, ", x, -y);
    }
}