5 条题解

  • 0
    @ 2025-11-30 17:07:12

    #include #include using namespace std; int main() { int n, m; cin >> n; // 输入幻方阶数(必须是奇数)

    int arry[40][40] = {0};  // 初始化30x30数组(最大支持29阶幻方)
    m = (n - 1) / 2;        // 计算中间位置(第1行中间列)
    
    int tempx = m, tempy = 0;  // 起始位置:[中间列][第0行]
    arry[tempx][tempy] = 1;    // 放置第一个数字1
    
    // 核心算法:按顺序填充2~n*n的数字
    for (int k = 2; k <= n * n; k++) {
        // 情况1:当前数字在第一行但不在最后一列
        if (tempx != n - 1 && tempy == 0) {
            tempx++;          // 移到最后一列
            tempy = n - 1;    // 移到最后一行
            arry[tempx][tempy] = k;
        }
        // 情况2:当前数字在最后一列但不在第一行
        else if (tempx == n - 1 && tempy != 0) {
            tempx = 0;        // 移到第一列
            tempy--;          // 移到上一行
            arry[tempx][tempy] = k;
        }
        // 情况3:当前数字在第一行最后一列(右上角)
        else if (tempx == n - 1 && tempy == 0) {
            tempy++;          // 直接下移一行
            arry[tempx][tempy] = k;
        }
        // 情况4:当前数字在中间位置
        else {
            // 尝试右上方位置(行减1,列加1)
            if (arry[tempx + 1][tempy - 1] == 0) {  // 右上方为空
                tempx++;
                tempy--;
                arry[tempx][tempy] = k;
            } else {  // 右上方已有数字
                tempy++;  // 直接下移一行
                arry[tempx][tempy] = k;
            }
        }
    }
    
    // 打印幻方(注意:按行输出,arry[列][行])
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < n; j++) {
            cout << arry[j][i] << " ";  // 列j, 行i
        }
        cout << endl;
    }
    return 0;
    

    }

    【深基5.例9】[NOIP2015 提高组] 神奇的幻方

    信息

    ID
    728
    时间
    1000ms
    内存
    256MiB
    难度
    10
    标签
    递交数
    7
    已通过
    2
    上传者