6 つの直近の隣接について話している場合、最も効率的な方法はハードコードすることです。
int neighbour_offsets[3][6] = {
{1, 0, 0},
{0, 1, 0},
{0, 0, 1},
{-1, 0, 0},
{0, -1, 0},
{0, 0, -1},
};
ランク <= の近傍ではr
、固定次元のネストされたfor
ループが機能します。
for (x = -r; x <= r; ++x) {
r_x = r - abs(x);
for (y = -r_x; y <= r_x; ++y) {
r_y = r_x - abs(y);
for (z = -r_y; z <= r_y; ++z) {
printf("%d, %d, %d\n", x, y, z);
}
}
}
d == r
ではなく距離を置いて隣人が必要な場合はd <= r
、 を使用しますz := {-r_y, r_y}
。
任意の低次元の場合、再帰は機能します (そしてかなり明確です)。高次元の場合は、再帰的なソリューションから始めて、それをループに変換するのが最善です。高次元 (D >> r) では、ほとんどの場合、オフセットはほとんどの次元でゼロになります。