NOIP 提高组初赛 · NOIP 2017 提高组初赛试题 第 24 题

选择题 · 答案 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 输出:_________

答案:17 24 1 8 15

考点

输入输出位运算 讲解 →位运算 真题汇总 →分支结构循环结构一维数组

解题思维

看到 n=3 先变 n=5 再填 1-25,别被输入值误导矩阵大小。

常见错误

变量 n 中途翻倍减一,循环次数和矩阵维度均随 n 变化,勿用输入值 3 计算。

详细解析(节选)

考点:模拟程序运行|奇数阶幻方构造算法

程序在做什么

初始化 40x40 数组,读入 n 后令 n=2*n-1,从 (0, n-1) 开始按斜向右上填数,出界绕回,遇占位则下移,填至 n*n 后输出第一行。

同考点真题

在 OI伴学 里做这道题
登录后可计时作答、查看完整六段式解析,并按你的错题自动生成同类练习。
去刷题先做一次 AI 学情诊断