Language agnostic 生成菱形周长上的所有点

Language agnostic 生成菱形周长上的所有点,language-agnostic,geometry,coordinates,Language Agnostic,Geometry,Coordinates,给出了一系列这样的钻石: 如何为每个钻石生成一个黑方块列表?假设红方块在{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,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是钻石的笛卡尔方程
通过最近的观察,我在C中发现了以下解决方案。但通过比较和对abs()的两次调用,现在是O(n^2)时间。难道没有一个更快的解决方案适合更大的钻石吗

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);
            }
        }
    }
}
void diamond_点(int n){
对于(intx=-n;x有,带O(n)

for(int x=-n;x 0){
printf(“{%d,%d},”,x,-y);
}
}

有点微优化,但我认为如果你把y==0的情况带到循环之外,你可以删除if语句:好吧,如果你每毫秒计算一次值,那么你应该试着去掉所有可能的
if
s:)@DragonDePlatino
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);
    }
}