5 条题解
-
0
#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;}
信息
- ID
- 728
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 7
- 已通过
- 2
- 上传者