女孩和机器人一起思考

一起动脑筋 · 先看一个小故事

棋子从 0 出发,向右 2 步,再向左 1 步。机器人把每一步的位置都记下来。

把过程摊开来看

沿着编号看一遍,再用自己的话讲一遍
  1. 起点0
  2. 右移 2变为 2
  3. 左移 1变为 1
  4. 终点1

模拟按题目给出的规则更新状态。

状态是此刻需要记住的信息,例如位置、方向和剩余次数。每做完一个动作,就用新的状态继续。

01什么是模拟?

模拟(Simulation)就是让程序按照题目规定的规则一步一步执行。

例如一个棋子每次向右走 2 格,走 5 次:

int position = 0;

for (int step = 0; step < 5; step++) {
    position += 2;
}

02模拟最重要的是什么?

不是代码长,而是规则翻译准确

状态

哪些量会变化?

规则

每一步怎样变化?

顺序

先做什么、后做什么?

终止

什么时候结束?

03什么叫“状态”?

状态是某一时刻描述问题所需的数据。

例如小游戏可能需要:

  • 角色位置
  • 生命值
  • 当前分数
  • 剩余时间

04为什么执行顺序会出错?

假设规则是“先移动,再检查是否撞墙”,如果程序写成“先检查,再移动”,结果可能不同。

读懂规则顺序更新状态检查结果

05模拟题为什么容易出现边界 Bug?

因为规则常包含“第一轮”“最后一格”“超过上限后回到开头”等特殊情况。

06怎样调试模拟程序?

最有效的方法之一是把每一步状态打印出来或画表:

步骤位置分数
000
1210
2420

你已经知道了什么

  • 模拟是把规则按顺序准确翻译成程序。
  • 要先设计清楚状态、规则和结束条件。
  • 执行顺序可能直接改变结果。
  • 模拟题特别要检查边界和特殊情况。
  • 逐步记录状态是调试模拟的好方法。

下一篇:顺序查找:从头找到尾

轮到你来试一试

若第二步错误地仍从起点算左移 1,会得到什么错误位置?

想好了吗?点开看解释

会得到 -1。正确做法从已经更新的 2 出发,得到 1。