如何用C++编写自然数螺旋路径坐标映射程序
实现思路
- 该螺旋为轴对齐正方形边界逆时针螺旋,第m个环(m≥1)上所有点满足
max(|x|, |y|) = m,每个环共8m个点,前m个环总点数为4*m*(m+1) - 第一步定位n所属的环m:找到最小的正整数m满足
4*(m-1)*m < n ≤ 4*m*(m+1) - 第二步计算环内偏移量:
offset = n - 4*(m-1)*m - 第三步按偏移量匹配环的四个边计算坐标:
- 偏移1~2m:右侧边向上走,坐标为
(m, offset - m) - 偏移2m+1~4m:上侧边向左走,坐标为
(3*m - offset, m) - 偏移4m+1~6m:左侧边向下走,坐标为
(-m, 5*m - offset) - 偏移6m+1~8m:下侧边向右走,坐标为
(offset -7*m, -m)
- 偏移1~2m:右侧边向上走,坐标为
C++ 实现代码
#include <iostream> #include <cmath> using namespace std; pair<int, int> getSpiralPoint(int n) { // 定位环编号m int m = ceil((sqrt(4 * n + 1) - 1) / 4); while (4 * m * (m + 1) < n) m++; while (4 * (m-1) * m >= n) m--; int offset = n - 4 * (m-1) * m; if (offset <= 2 * m) { return {m, offset - m}; } else if (offset <= 4 * m) { return {3 * m - offset, m}; } else if (offset <= 6 * m) { return {-m, 5 * m - offset}; } else { return {offset - 7 * m, -m}; } } int main() { int n; cin >> n; auto res = getSpiralPoint(n); cout << res.first << " " << res.second << endl; return 0; }
用例验证
- 输入
2:m=1,offset=2≤2*1,返回(1, 2-1=1),符合输出要求 - 输入
12:m=2,offset=12-412=4≤2*2,返回(2,4-2=2),符合输出要求
内容的提问来源于stack exchange,提问作者Anita F
相关产品推荐
相关产品推荐

