椰程信奥·互动课件 专题1·模拟
10:00 1 / 15
🧭 椰程信奥 · CSP复赛专题系列

专题1 · 模拟

模拟不是“笨办法”,而是把题目要求的每一步操作忠实地翻译成代码。
本讲带你建立“读题 → 建模 → 分步 → 验证”的通用框架,并用两道经典真题练手。

GESP202403 四级 T1 相似字符串 NOIP2015 提高 T1 神奇的幻方 四步法通用框架
本质

模拟:让计算机“照着题意做”

模拟题几乎不考“巧妙算法”,考的是准确理解题意 + 把操作转成代码的工程能力。

🧩 核心一句话

题目让你“先做什么、再做什么”,你就原样照做:用变量记录状态,用循环/分支执行规则,最后按格式输出。

例:“找成绩最好的同学” → 求数组最大值;
“按规则把数填进矩阵” → 按规则循环赋值。

⚠️ 模拟为什么容易错

  • 边界:第 1 行/最后一列、空位判断、数组越界。
  • 顺序:规则之间的优先级写反(先判断哪个分支?)。
  • 格式:行末空格、换行、大小写(similar / not similar)。
  • 状态:没初始化、用 0 当“未填”却误判。

🖼️ 看图:模拟题就是"照着说明书一步步做"

没有巧妙算法,只有四个动作——把题意"翻译"成代码 ① 读题 看清"要做什么" ② 拆步骤 写成 1、2、3… ③ 照做 循环 + 分支实现 ④ 输出 格式一模一样 📌 模拟题不考"巧",考"细":漏一个边界、多一个空格,样例就过不了。
阅卷老师只看输出是否逐字节一致。所以模拟题“思路对”不够,必须格式、边界、初始化全都到位。把样例当契约,能跑通样例再交。
3D🎲 模拟 = 沿时间轴一格格推进状态🖱 拖拽旋转 · 双击复位
为什么用 3D:模拟题最容易错的是「状态没记全」。把 8 个时间步摆成一条立体的时间轴,能直观看出状态是一步步被推着走的,而不是一团糨糊。
通用框架

模拟题四步法

模拟题四步法:题目说什么,你就做什么——顺序不能乱第 1 步建模用什么存第 2 步边界越界怎么办第 3 步方向往哪走第 4 步输出格式对不对最容易翻车的是第 2 步边界和第 4 步输出格式——它们不考算法,但一分都拿不回来。

① 读题建模

把“题目在说什么”翻译成数据:用数组/矩阵/变量存什么?状态怎么表示?

② 拆解步骤

把操作列成有序清单:先处理谁?规则之间优先级?不要跳步。

③ 边界处理

第 1 行/最后一列、空位、越界、等长/差 1 的特判,提前想清楚。

④ 验证输出

用样例逐字节核对;跑一边“如果我手算会怎样”,再对齐格式。

提醒:四步法不是“背流程”,而是每次写模拟前在草稿上走一遍。绝大多数WA都出在第②③步没想全。
写代码前,先用人话 + 伪代码把规则写三行:①循环范围 ②每个分支条件 ③输出格式。再翻译成 C++,错的概率直接降一半。
题型地图

模拟常考的 4 类题型

四类模拟题:看到关键词先归类,套路就出来了① 按规则填幻方 / 矩阵关键是坐标换算与越界回绕② 按指令走机器人 / 指针方向数组 + 步数边界要判③ 按时间推日期 / 周期取模算周期闰年别漏④ 按流程办状态机 / 队列一步步改状态顺序别颠倒判断标准:能不能用几句话说清「每一步做什么」。说不清,就是建模还没到位。

1️⃣ 基本操作模拟

题意就是一串明确步骤(如字符串比较、计数),重点是精准翻译成代码。

2️⃣ 简单场景模拟

地图/角色移动、规则应用(如按方向走、按格子填数),重点是状态数组 + 下标。

3️⃣ 复杂系统模拟

多因素相互作用(如购票、排队、日程),重点是数据结构设计(谁先、谁空)。

4️⃣ 算法结合模拟

模拟里套找规律/快速幂/递推,重点是先模拟跑通,再想优化。

本讲两道例题正好覆盖 ①基本操作(相似字符串) 与 ②简单场景(神奇的幻方)——先拿下最稳的送分档。
例题 1 / GESP202403 四级 T1

相似字符串:判定逻辑怎么拆

定义: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
真去“删字符生成新串”既慢又易错。双指针只比较不真的删:长串多出的那个字符被“跳过”,等价于把它删掉后比较,但代码更短、更安全。
互动

相似字符串 · 分步比对模拟器

样例
A
B
点击「下一步」开始比对。
例题 1

相似字符串 · 代码走读

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。
例题 2 / NOIP2015 提高 T1

神奇的幻方:把“填数规则”翻译成循环

奇数阶幻方:1 放第一行正中间,之后按 4 条规则从小到大填 2…N²。

📍 起点

第 1 行,第 (N+1)/2 列(1-based)。

🧭 4 条规则(按优先级)

  • ① 在第1行且不在末列 → 填最后一行、右一列。
  • ② 在末列且不在第1行 → 填第一列、上一行。
  • ③ 在第1行末列 → 填正下方。
  • ④ 其他:右上方空 → 右上;否则 → 正下方。
幻方只填 1…N²,永远不会是 0。所以 a[r][c]==0 天然表示“这个格子还空着”,用来判断规则④的“右上方是否已填”。初始化全 0 即可,不用额外 vis 数组。
互动

神奇的幻方 · 规则步进器

阶数
点击「下一步」,看数字如何按规则“走”进格子。
例题 2

神奇的幻方 · 代码走读

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;
}
三个易错点:① 数组必须 1-based(r、c 从 1 开始),否则第 1 行/末列判断全错;② 4 条规则顺序不能换,①②③是“越界特判”必须先于④;③ 用 ==0 判空,别忘了先 memset 或全局数组默认 0。
诊断

两道真题的易错辨析

① 相似字符串中,若两串长度相差 2,应当如何处理?

② 神奇的幻方里,用 a[r][c]==0 判断“右上方是否已填”,前提是?

③ 模拟题 WA 了,第一步该查什么?

小结

本讲知识树

模拟 四步法:建模→分步→边界→验证 基本操作模拟(相似字符串) 简单场景模拟(幻方) 草稿列步骤·别跳步 双指针·跳过≤1 1-based·规则顺序
一句话带走:模拟题拼的是细心不是技巧——把“题意”逐字翻译成“代码”,再用样例逐字节验。
拿分

一道题 100 分是分档给的——不会正解也要先拿保底

复赛一道题的 100 分由十几到二十几个测试点组成, 前面几档专门为「没想出正解的人」准备。四道题各拿 30~40 分, 加起来往往就是一等奖和二等奖的分界。

第 1 档 特判 5~10 分 约 2 分钟 第 2 档 暴力 20~30 分 约 8 分钟 第 3 档 特殊性质 40~60 分 约 15 分钟 第 4 档 正解 100 分 约 25 分钟

① 特判档:先别想算法,看数据范围表

题目给的数据范围表就是出题人给你的送分清单。看到「n = 1」「只有一组数据」这类一行, 就先写个 if 直接输出答案。2 分钟换 5~10 分,全场最划算。

② 暴力档:按题意最直白地写一遍

多重循环、DFS 全枚举、朴素 O(n³)……不要优化,只要保证最小那档全对。 它既是保底分,又是后面对拍的标尺——没有它你无法证明正解是对的。

③ 特殊性质档:题目里那句「若……」

常见的送分性质:数据已经有序、所有值完全相同、规模小到可以 O(n²)、 只出现一种类型。题目写出来就是让你拿的,专门写一份即可。

④ 正解档:思路定了,就赢了八成

考场上的时间几乎都花在想思路上,不是写代码。写完先跑样例, 再用第 ② 档的暴力版造小数据对拍——这是唯一能证明你思路对的办法。

考场纪律:每档设时间上限,到点还没调通就 立刻提交当前版本,保住已有分数,再往上冲。最常见的翻车是"正解写了 50 分钟没过,连暴力分都没交上去"。
拿分

本讲 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 分钟
四种情况全处理:行列都越界 / 只行越界 / 只列越界 / 目标已填

50 分钟时间盒(一题的节奏):
0–5 分钟 读题 + 圈出数据范围表里最小的那几档 → 5–15 分钟 写完第 1、2 档并先交一次(保住 20~30 分)→ 15–40 分钟 冲第 3、4 档 → 40–50 分钟 造小数据对拍、检查 freopen 与文件名。
课堂上别让学生"从头想正解"。先要求每个人 15 分钟内交出第 1、2 档, 再放开冲正解。这个顺序一换,平均分通常能涨一大截——因为它杜绝了"想了 40 分钟,交上去 0 分"。
当堂检测

椰程信奥当堂测评

① 下面哪类操作,相似字符串认为两串“相似”?

② 神奇的幻方构造里,规则④“右上方已填”时应填在哪?

下机前请把两道题的标程各写一遍:相似字符串(双指针)、幻方(4 规则循环)。能默写≈本讲过关。

目录