专题1 · 模拟
模拟不是“笨办法”,而是把题目要求的每一步操作忠实地翻译成代码。
本讲带你建立“读题 → 建模 → 分步 → 验证”的通用框架,并用两道经典真题练手。
模拟:让计算机“照着题意做”
模拟题几乎不考“巧妙算法”,考的是准确理解题意 + 把操作转成代码的工程能力。
🧩 核心一句话
题目让你“先做什么、再做什么”,你就原样照做:用变量记录状态,用循环/分支执行规则,最后按格式输出。
例:“找成绩最好的同学” → 求数组最大值;
“按规则把数填进矩阵” → 按规则循环赋值。
⚠️ 模拟为什么容易错
- 边界:第 1 行/最后一列、空位判断、数组越界。
- 顺序:规则之间的优先级写反(先判断哪个分支?)。
- 格式:行末空格、换行、大小写(similar / not similar)。
- 状态:没初始化、用 0 当“未填”却误判。
🖼️ 看图:模拟题就是"照着说明书一步步做"
模拟题四步法
① 读题建模
把“题目在说什么”翻译成数据:用数组/矩阵/变量存什么?状态怎么表示?
② 拆解步骤
把操作列成有序清单:先处理谁?规则之间优先级?不要跳步。
③ 边界处理
第 1 行/最后一列、空位、越界、等长/差 1 的特判,提前想清楚。
④ 验证输出
用样例逐字节核对;跑一边“如果我手算会怎样”,再对齐格式。
模拟常考的 4 类题型
1️⃣ 基本操作模拟
题意就是一串明确步骤(如字符串比较、计数),重点是精准翻译成代码。
2️⃣ 简单场景模拟
地图/角色移动、规则应用(如按方向走、按格子填数),重点是状态数组 + 下标。
3️⃣ 复杂系统模拟
多因素相互作用(如购票、排队、日程),重点是数据结构设计(谁先、谁空)。
4️⃣ 算法结合模拟
模拟里套找规律/快速幂/递推,重点是先模拟跑通,再想优化。
相似字符串:判定逻辑怎么拆
定义:A 经过“删一个 / 插一个 / 改一个”字符可变成 B,则相似;完全相同也算相似。
长度相同
只能是“改”。逐位比较,统计不同字符数;≤ 1 个则相似。
长度差 1
只能是“插/删”。短串 i、长串 j 双指针:遇到不同,长串跳过 1 个继续比;最多允许跳过 1 次。
长度差 > 1
一次操作改不了这么多 → 直接不相似。
if(la==lb) 统计不同位 ≤1 ? similar : not else if(|la-lb|==1) 双指针,长串最多跳过1次 ? similar : not else not similar
相似字符串 · 分步比对模拟器
相似字符串 · 代码走读
bool similar(string a, string b){ if(a==b) return true; // 完全相同 if(a.size()==b.size()){ // 等长→只可能“改” int d=0; for(int i=0;i<a.size();i++) if(a[i]!=b[i]) d++; return d<=1; } string s = a.size()<b.size()?a:b; // 短串 / 长串 string l = a.size()<b.size()?b:a; if(l.size()-s.size()!=1) return false; // 长度差>1 int i=0,j=0,skip=0; while(i<s.size() && j<l.size()){ if(s[i]==l[j]){i++;j++;} else{ skip++; if(skip>1) return false; j++; } // 跳过1个长串字符 } return true; }
skip>1 一旦超过就要立刻 return false;如果等到循环结束才判,会多算。还有 输出大小写:`similar` / `not similar` 拼错一个字母就全 WA。神奇的幻方:把“填数规则”翻译成循环
奇数阶幻方:1 放第一行正中间,之后按 4 条规则从小到大填 2…N²。
📍 起点
第 1 行,第 (N+1)/2 列(1-based)。
🧭 4 条规则(按优先级)
- ① 在第1行且不在末列 → 填最后一行、右一列。
- ② 在末列且不在第1行 → 填第一列、上一行。
- ③ 在第1行末列 → 填正下方。
- ④ 其他:右上方空 → 右上;否则 → 正下方。
a[r][c]==0 天然表示“这个格子还空着”,用来判断规则④的“右上方是否已填”。初始化全 0 即可,不用额外 vis 数组。神奇的幻方 · 规则步进器
神奇的幻方 · 代码走读
int a[40][40]; int r=1, c=(n+1)/2; a[r][c]=1; for(int k=2;k<=n*n;k++){ if(r==1 && c!=n) { r=n; c++; } // 规则① else if(c==n && r!=1) { c=1; r--; } // 规则② else if(r==1 && c==n) { r++; } // 规则③ else { // 规则④ if(a[r-1][c+1]==0){ r--; c++; } // 右上方空→右上 else { r++; } // 否则→正下方 } a[r][c]=k; }
==0 判空,别忘了先 memset 或全局数组默认 0。两道真题的易错辨析
① 相似字符串中,若两串长度相差 2,应当如何处理?
② 神奇的幻方里,用 a[r][c]==0 判断“右上方是否已填”,前提是?
③ 模拟题 WA 了,第一步该查什么?
本讲知识树
一道题 100 分是分档给的——不会正解也要先拿保底
复赛一道题的 100 分由十几到二十几个测试点组成, 前面几档专门为「没想出正解的人」准备。四道题各拿 30~40 分, 加起来往往就是一等奖和二等奖的分界。
① 特判档:先别想算法,看数据范围表
题目给的数据范围表就是出题人给你的送分清单。看到「n = 1」「只有一组数据」这类一行,
就先写个 if 直接输出答案。2 分钟换 5~10 分,全场最划算。
② 暴力档:按题意最直白地写一遍
多重循环、DFS 全枚举、朴素 O(n³)……不要优化,只要保证最小那档全对。 它既是保底分,又是后面对拍的标尺——没有它你无法证明正解是对的。
③ 特殊性质档:题目里那句「若……」
常见的送分性质:数据已经有序、所有值完全相同、规模小到可以 O(n²)、 只出现一种类型。题目写出来就是让你拿的,专门写一份即可。
④ 正解档:思路定了,就赢了八成
考场上的时间几乎都花在想思路上,不是写代码。写完先跑样例, 再用第 ② 档的暴力版造小数据对拍——这是唯一能证明你思路对的办法。
本讲 2 道题,各自的四档怎么走
相似字符串 · SIMSTR
第1档 · 2 分钟
长度差 > 1 → 直接判不相似;两串完全相同 → 相似
第2档 · 8 分钟
枚举「删一个 / 插一个 / 改一个」的所有结果逐个比对,长度 ≤ 100 稳过
第3档 · 10 分钟
先只判「长度相等时逐位比、不同位数 ≤ 1」,拿掉改字符那一档
第4档 · 15 分钟
分三类:长度相等数不同位数;长度差 1 用双指针跳过一次;否则不相似
神奇的幻方 · MAGIC
第1档 · 2 分钟N == 1 → 直接输出 1
第2档 · 8 分钟
完全按 4 条规则一步步填,N ≤ 39 随便跑
第3档 · 10 分钟
先把「右上方格」的坐标换算写对(行 −1、列 +1,越界绕回),只做这一半
第4档 · 15 分钟
四种情况全处理:行列都越界 / 只行越界 / 只列越界 / 目标已填
0–5 分钟 读题 + 圈出数据范围表里最小的那几档 → 5–15 分钟 写完第 1、2 档并先交一次(保住 20~30 分)→ 15–40 分钟 冲第 3、4 档 → 40–50 分钟 造小数据对拍、检查
freopen 与文件名。椰程信奥当堂测评
① 下面哪类操作,相似字符串认为两串“相似”?
② 神奇的幻方构造里,规则④“右上方已填”时应填在哪?