You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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)
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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 19:54:04