NOIP 普及组初赛 · NOIP 2017 普及组初赛试题 第 26 题

阅读程序 · 答案 1 32017 1 · 考点:输入输出、位运算、分支结构、循环结构

← 整套速查表 NOIP 普及组初赛 全部真题

题目

阅读程序写结果:

#include<iostream>
using namespace std;
int main()
{
    int n, m;
    cin >> n >> m;
    int x = 1;
    int y = 1;
    int dx = 1;
    int dy = 1;
    int cnt = 0;
    while (cnt != 2)
    {
        cnt = 0;
        x = x + dx;
        y = y + dy;
        if (x == 1 || x == n)
        {
            ++cnt;
            dx = -dx;
        }
        if (y == 1 || y == m)
        {
            ++cnt;
            dy = -dy;
        }
    }
    cout << x << " " << y << endl;
    return 0;
}

输入 1:4 3 输出 1:_________(3 分)

输入 2:2017 1014 输出 2:_________(5 分)

答案:1 32017 1

考点

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

解题思维

看到矩形反弹模拟 → 先画坐标轴,记清「先更新坐标再判边界」的顺序

常见错误

cnt==2 仅统计「本轮同时撞两面墙」,撞一面只加 1;反弹只改方向不改坐标,否则易越界

详细解析(节选)

考点:模拟算法|循环结构

程序在做什么

从 (1,1) 出发,每步 x+dx、y+dy;碰到 x=1/n 或 y=1/m 时反转对应方向,cnt 统计本轮撞墙数,撞两面即停。

同考点真题

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