
一起动脑筋 · 先看一个小故事
棋子从 0 出发,向右 2 步,再向左 1 步。机器人把每一步的位置都记下来。
把过程摊开来看
- 起点0
- 右移 2变为 2
- 左移 1变为 1
- 终点1
模拟按题目给出的规则更新状态。
状态是此刻需要记住的信息,例如位置、方向和剩余次数。每做完一个动作,就用新的状态继续。
01什么是模拟?
模拟(Simulation)就是让程序按照题目规定的规则一步一步执行。
例如一个棋子每次向右走 2 格,走 5 次:
int position = 0;
for (int step = 0; step < 5; step++) {
position += 2;
}
02模拟最重要的是什么?
不是代码长,而是规则翻译准确。
状态
哪些量会变化?
规则
每一步怎样变化?
顺序
先做什么、后做什么?
终止
什么时候结束?
03什么叫“状态”?
状态是某一时刻描述问题所需的数据。
例如小游戏可能需要:
- 角色位置
- 生命值
- 当前分数
- 剩余时间
04为什么执行顺序会出错?
假设规则是“先移动,再检查是否撞墙”,如果程序写成“先检查,再移动”,结果可能不同。
读懂规则顺序→更新状态→检查结果
05模拟题为什么容易出现边界 Bug?
因为规则常包含“第一轮”“最后一格”“超过上限后回到开头”等特殊情况。
06怎样调试模拟程序?
最有效的方法之一是把每一步状态打印出来或画表:
| 步骤 | 位置 | 分数 |
|---|---|---|
| 0 | 0 | 0 |
| 1 | 2 | 10 |
| 2 | 4 | 20 |
你已经知道了什么
- 模拟是把规则按顺序准确翻译成程序。
- 要先设计清楚状态、规则和结束条件。
- 执行顺序可能直接改变结果。
- 模拟题特别要检查边界和特殊情况。
- 逐步记录状态是调试模拟的好方法。
下一篇:顺序查找:从头找到尾
轮到你来试一试
若第二步错误地仍从起点算左移 1,会得到什么错误位置?
想好了吗?点开看解释
会得到 -1。正确做法从已经更新的 2 出发,得到 1。