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) では、ほとんどの場合、オフセットはほとんどの次元でゼロになります。