深高北-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判断下标是不是在范围内 |
| 什么时候停 | 想清楚循环结束的条件 |
| 方向搞错 | 在纸上画图,用方向数组写清楚 |
四、总结
| 要点 | 内容 |
|---|---|
| 核心思想 | 用代码还原题目说的规则 |
| 优点 | 思路简单,不用想复杂公式 |
| 缺点 | 代码可能很长,容易少考虑情况 |
| 什么时候用 | 题目把规则说得很清楚,一步步做就行 |
| 注意什么 | 边界要小心,多测试几遍 |
记忆口诀
模拟就是照着做,一步一步别乱走
边界条件多想想,纸笔画图好帮手
循环结束要记牢,数组越界防得住
全部评论 16
你爹已预习
5小时前 来自 广东
1已预习
6天前 来自 广东
1王恩和已预习
5小时前 来自 广东
0已预习
5小时前 来自 广东
0已预习
5小时前 来自 广东
0已预习
8小时前 来自 广东
0吴子墨已预习
昨天 来自 广东
0余知行已预习

2天前 来自 广东
0已预习

4天前 来自 广东
0李嘉树已预习
5天前 来自 广东
0张卓轩已预习
5天前 来自 广东
0已预习
5天前 来自 广东
0吓哭了myx已预习
5天前 来自 广东
0黄睿宸已预习
6天前 来自 广东
0付文韬已预习
1周前 来自 广东
0周一诺已预习
1周前 来自 广东
0








































有帮助,赞一个