鉴于这样的一系列钻石:
如何生成每颗钻石的黑色方块列表?假设红色方块位于{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是从原点到角落的距离):
通过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);
}
}
}
}
答案 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);
}
}