```cpp #include<bits/stdc++.h> using namespace std; const int MAXN = 105; // 定义最大的矩阵边长 int magicSquare[MAXN][MAXN]; // 定义二维数组来存储魔方 int main() { int n; cin >> n; // 输入魔方的阶数 // 初始化魔方所有元素为0 memset(magicSquare, 0, sizeof(magicSquare)); // 确定第一个元素的位置 int row = 0, col = n / 2; magicSquare[row][col] = 1; // 填充魔方 for (int num = 2; num <= n * n; num++) { int nextRow = (row - 1 + n) % n; // 计算上一行 int nextCol = (col + 1) % n; // 计算右一列 if (magicSquare[nextRow][nextCol] == 0) { // 如果该位置未被填充 row = nextRow; col = nextCol; } else { // 如果该位置已被填充 row = (row + 1) % n; // 向下移动一行 } magicSquare[row][col] = num; // 填充当前数字 } // 输出魔方 for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) { if (j != 0) { cout << " "; } cout << magicSquare[i][j]; } cout << endl; } return 0; } ``` 额外注意的逻辑点 1. 在计算下一个位置时,使用 `(row - 1 + n) % n` 和 `(col + 1) % n` 来处理边界情况,确保不会越界。 2. 当填充位置已被占用时,要正确处理向下移动一行的逻辑,避免出现死循环。 3. 输出时要注意行尾不能有多余的空格,需要进行相应的判断。 [2025-07-20 16:24:49 | AI写代码神器 | 496点数解答]