深高北-L21-模拟算法
2026-05-08 16:43:48
发布于:广东
模拟算法笔记(C++版)
一句话理解
模拟算法:照着题目的要求,一步一步用代码实现出来。
就像照着菜谱做菜——菜谱说“放盐”,你就放盐;菜谱说“翻炒3分钟”,你就等3分钟。不玩花哨,老老实实按规则来。
一、什么是模拟?
模拟:把现实中的过程或题目描述的规则,用代码还原出来。
特点:
- 思路简单,不用想复杂的数学公式
- 按照题目给的步骤一步步写
- 考验的是细心和代码实现能力
二、经典例子
例子1:红绿灯
题目:一个红绿灯,红灯25秒,绿灯30秒,黄灯3秒。输入一个时间(秒),输出当前是什么灯。
思路:一个完整循环是25+30+3=58秒,看时间在循环的哪一段。
#include <iostream>
using namespace std;
int main() {
int nowTime;
cout << "请输入时间:";
cin >> nowTime;
int oneCircle = 58; // 红灯25 + 绿灯30 + 黄灯3
int t = nowTime % oneCircle;
if (t < 25) {
cout << "红灯" << endl;
} else if (t < 55) { // 25 + 30 = 55
cout << "绿灯" << endl;
} else {
cout << "黄灯" << endl;
}
return 0;
}
例子2:存钱罐
题目:小明每天往存钱罐里存5块钱,但每存3天就要打破罐子取出10块钱买零食。问第30天结束时,罐子里有多少钱?
思路:一天一天模拟,每天加5,每3天减10。
#include <iostream>
using namespace std;
int main() {
int money = 0; // 罐子里的钱
for (int day = 1; day <= 30; day++) {
// 每天存5块
money = money + 5;
cout << "第" << day << "天存钱后:" << money << "元" << endl;
// 每3天取10块买零食
if (day % 3 == 0) {
money = money - 10;
cout << " 买零食花了10元,还剩:" << money << "元" << endl;
}
}
cout << "第30天结束,罐子里有:" << money << "元" << endl;
return 0;
}
输出:
第1天存钱后:5元
第2天存钱后:10元
第3天存钱后:15元
买零食花了10元,还剩:5元
第4天存钱后:10元
...
第30天结束,罐子里有:100元
例子3:蜗牛爬井
题目:一口井10米深,蜗牛白天爬3米,晚上滑下2米。问第几天能爬出去?
思路:一天一天模拟,白天往上爬,如果到了井口就结束,晚上往下滑。
#include <iostream>
using namespace std;
int main() {
int deep = 10; // 井深10米
int up = 3; // 白天上3米
int down = 2; // 晚上下2米
int nowHigh = 0; // 现在的高度
int day = 0; // 第几天
while (nowHigh < deep) {
day = day + 1;
// 白天爬
nowHigh = nowHigh + up;
cout << "第" << day << "天白天,爬到" << nowHigh << "米";
// 检查是否爬出去了
if (nowHigh >= deep) {
cout << ",爬出去啦!" << endl;
break;
}
// 晚上滑
nowHigh = nowHigh - down;
cout << ",晚上滑到" << nowHigh << "米" << endl;
}
cout << "一共用了" << day << "天" << endl;
return 0;
}
输出:
第1天白天,爬到3米,晚上滑到1米
第2天白天,爬到4米,晚上滑到2米
第3天白天,爬到5米,晚上滑到3米
第4天白天,爬到6米,晚上滑到4米
第5天白天,爬到7米,晚上滑到5米
第6天白天,爬到8米,晚上滑到6米
第7天白天,爬到9米,晚上滑到7米
第8天白天,爬到10米,爬出去啦!
一共用了8天
例子4:蛇形填数
题目:在5×5的格子里,从左上角开始,按顺时针方向(右→下→左→上→右...)填入1到25。
思路:用方向数组控制方向,撞墙或遇到填过的格子就转弯。
#include <iostream>
using namespace std;
int main() {
int n = 5;
int a[5][5] = {0}; // 全部先填0
// 方向顺序:右、下、左、上
int dx[4] = {0, 1, 0, -1};
int dy[4] = {1, 0, -1, 0};
int x = 0, y = 0; // 当前位置
int dir = 0; // 当前方向:0右 1下 2左 3上
int num = 1; // 要填的数字
while (num <= n * n) {
a[x][y] = num;
num = num + 1;
// 看看下一个位置
int nx = x + dx[dir];
int ny = y + dy[dir];
// 如果下一个位置出界了,或者已经填过数字了
if (nx < 0 || nx >= n || ny < 0 || ny >= n || a[nx][ny] != 0) {
dir = (dir + 1) % 4; // 转弯
nx = x + dx[dir];
ny = y + dy[dir];
}
x = nx;
y = ny;
}
// 输出格子
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
cout << a[i][j] << "\t";
}
cout << endl;
}
return 0;
}
输出:
1 2 3 4 5
16 17 18 19 6
15 24 25 20 7
14 23 22 21 8
13 12 11 10 9
三、写模拟题的小技巧
三步走:
- 看懂规则:题目让你做什么?自己在纸上画一遍过程
- 选好变量:想想要用哪些变量来记录状态
- 翻译代码:把每一步规则写成代码
容易踩的坑:
| 容易错的地方 | 怎么办 |
|---|---|
| 边界条件 | 多试几个边界值,比如第1天、最后一天 |
| 数组越界 | 用if判断下标是不是在范围内 |
| 什么时候停 | 想清楚循环结束的条件 |
| 方向搞错 | 在纸上画图,用方向数组写清楚 |
四、总结
| 要点 | 内容 |
|---|---|
| 核心思想 | 用代码还原题目说的规则 |
| 优点 | 思路简单,不用想复杂公式 |
| 缺点 | 代码可能很长,容易少考虑情况 |
| 什么时候用 | 题目把规则说得很清楚,一步步做就行 |
| 注意什么 | 边界要小心,多测试几遍 |
记忆口诀
模拟就是照着做,一步一步别乱走
边界条件多想想,纸笔画图好帮手
循环结束要记牢,数组越界防得住
全部评论 2
付文韬已预习
51分钟前 来自 广东
0周一诺已预习
54分钟前 来自 广东
0






















有帮助,赞一个