选择题 · 答案 17 24 1 8 15 · 考点:输入输出、位运算、分支结构、循环结构、一维数组
← 整套速查表 NOIP 提高组初赛 全部真题#include <iostream>
using namespace std;
int main() {
int n, i, j, x, y, nx, ny;
int a[40][40];
for (i = 0; i < 40; i++)
for (j = 0; j < 40; j++)
a[i][j] = 0;
cin >> n;
y = 0;
x = n - 1;
n = 2 * n - 1;
for (i = 1; i <= n * n; i++) {
a[y][x] = i;
ny = (y - 1 + n) % n;
nx = (x + 1) % n;
if ((y == 0 && x == n - 1) || a[ny][nx] != 0)
y = y + 1;
else {
y = ny; x = nx;
}
}
for (j = 0; j < n; j++)
cout << a[0][j] << " ";
cout << endl;
return 0;
}输入:3 输出:_________
看到 n=3 先变 n=5 再填 1-25,别被输入值误导矩阵大小。
变量 n 中途翻倍减一,循环次数和矩阵维度均随 n 变化,勿用输入值 3 计算。
考点:模拟程序运行|奇数阶幻方构造算法
初始化 40x40 数组,读入 n 后令 n=2*n-1,从 (0, n-1) 开始按斜向右上填数,出界绕回,遇占位则下移,填至 n*n 后输出第一行。