🎱 球的反弹运动 - 算法可视化教学

📋 题目描述

一个球在一条有 n 个格子的直线上运动,格子编号从 1 到 n。球初始位于位置 p,初始方向向右。

每次移动,球会向当前方向前进 1 格。如果球会越过边界(小于 1 或大于 n),则会在边界处反弹:当球要越过右边界时,会反弹向左;当球要越过左边界时,会反弹向右。

反弹后球的位置根据实际移动距离计算。给定初始位置 p 和移动步数 v,求移动 v 步后球的位置。

📥 输入格式

一行三个整数 n、p、v(1 ≤ n ≤ 100,1 ≤ p ≤ n,1 ≤ v ≤ 100)

📤 输出格式

一个整数,表示移动 v 步后球的位置

💡 核心思想

模拟法:
1. 用变量 pos 记录当前位置,dir 记录方向(1表示向右,-1表示向左)
2. 每步执行:pos += dir
3. 到达边界时切换方向:pos == n 时向左,pos == 1 时向右
4. 模拟 v 步后输出最终位置

📊 样例输入

// 样例1 10 2 3 // 样例2 5 3 8

📊 样例输出

// 样例1 5 // 样例2 3

📌 注意事项

1. 边界判断要在移动之后进行
2. 方向切换:到达右边界向左,到达左边界向右
3. 初始方向是向右(dir = 1)
当前步数
0
当前位置
-
当前方向
总格数 n
-
当前方向:

💡 当前步骤

点击「自动播放」或「单步」开始演示

📈 执行记录

步数 起始位置 方向 终止位置 说明

⏱ 时间复杂度

O(v)

💾 空间复杂度

O(1)

⚠️ 常见错误

1. 方向变量初始值错误(应为1表示向右)
2. 边界判断在移动之前进行(应在移动后判断)
3. 边界判断用 > 和 < 而非 ==(边界值恰好是 n 和 1)

💻 C++ 参考代码

// 球的反弹运动 #include <iostream> using namespace std; int main() { int n, p, v; cin >> n >> p >> v; int pos = p; // 当前位置 int dir = 1; // 方向:1表示向右,-1表示向左 for (int i = 0; i < v; i++) { pos += dir; // 向当前方向移动一格 if (pos == n) { dir = -1; // 到达右边界,反弹向左 } else if (pos == 1) { dir = 1; // 到达左边界,反弹向右 } } cout << pos << endl; return 0; }