第一章:锁柜之谜 / Chapter 1: The Locked Locker Mystery
九月的晨光像融化的蜂蜜,黏稠而温暖地涂抹在启航中学灰白色的教学楼外墙上。林小雨站在拥挤的二楼走廊里,手里捧着一本崭新的《算法导论》——那是她硬缠着学长买的“高级参考书”——却觉得它此刻重得像个讽刺。开学第一天,她就把自己的储物柜密码彻底忘了。那个用了整整一学年、刻在肌肉记忆里的四位数组合,此刻在她脑中只剩下一片空白,仿佛被一只无形的手凭空抹去。周围是喧闹的嬉笑和金属柜门开合的哐当声,每一声都像在敲打她紧绷的神经。她甚至能听见自己太阳穴血管突突跳动的声音。
“怎么,新书还没捂热,就准备和它一起住进柜子了?”一个带着笑意的声音从旁边传来。Sophie,她的同桌,一个金发碧眼、的中英双语流利的“国际范”女孩,正抱着一叠社团宣传单,挑眉看着她。
“别笑,”林小雨压低声音,用中文回道,手指无意识地抠着书页边缘,“我真的忘了。试了三次,都提示‘密码错误’。”
“那就再试啊,”Sophie耸耸肩,用英文说,语气轻快得像在讨论天气,“Try and error. There are only ten thousand possibilities, right? You’ll get it eventually.” (“试错嘛。总共不过一万种可能,对吧?迟早能蒙对。”)
林小雨盯着她,脑海里却瞬间闪过上学期信息技术课上,李老师站在投影幕布前,用红笔圈出的那个词:Decomposition(分解)。老师当时说:“面对一个复杂问题,高手和菜鸟的第一个区别,就是会不会把它‘拆开’。” 当时她抄了笔记,却没想到,第一个“拆”的,竟是自己这锁得死死的柜子。
“Eventually?” 林小雨重复着这个词,心里某个地方轻轻动了一下。她深吸一口气,走廊里消毒水和粉笔灰的味道涌入鼻腔。慌,没用。急,更没用。她需要像李老师说的那样,把这个“打开柜子”的大怪兽,切成她的小块。
“小雨,你还好吗?”Sophie见她脸色发白,收起戏谑,用中文关切地问。
“我没事,”林小雨摇头,目光却已投向那排冰冷的、编号从101到120的灰色柜门。她的柜子是107。一个简单的目标。但达成目标的路径,此刻被迷雾笼罩。“我只是……需要换个思路。不能乱试。”
“那你想怎样?”Sophie好奇地凑近。
“我得先弄清楚,我可能把密码设成什么。”林小雨的声音渐渐平稳,像暴风雨前的海面开始沉淀。她走到窗边,背靠冰凉的玻璃,闭上眼睛。阳光透过睫毛,在视网膜上染出红色的光晕。她开始回忆。
---
**第一步:回忆线索 (Recall the Clues)**
“密码,对我来说,从来不是随机数字。”林小雨睁开眼,对Sophie说,同时在心里对自己说。她掏出随身携带的、画满贴纸的线圈本——这是她的“生活痕迹收集器”。
“你看,我的密码习惯,有几个原则。”她翻到一页画着思维导图的纸,虽然此刻它空空如也,但框架早已印在脑子里。
1. 与个人重要日期相关,但会变形。 她立刻想到自己的生日:2008年9月12日。直接写0912?太明显。她常把年份后两位和月日组合,比如1209(12月9日?不对,是9月12日),或者倒序,比如2109。或者取年份08,加上月日,80912?但密码只有四位。那么,可能是后四位0912?但开学时她就觉得太简单,可能改过。她圈出“生日变形”这个线索。
2. 与家人或朋友相关。 妈妈生日是75年3月18日。父亲是76年11月5日。直接取四位?7518?7605?或者组合?她摇摇头,自己从未用过父母的完整生日。但也许用过他们的生日数字的某种运算?比如妈妈生日3月18日,3+18=21?不,两位数。3*18=54?这个有可能。她记下“父母生日数字运算”。
3. 与学号或班级信息相关。 她的学号是20230815。四位密码……可能是后四位0815?这是她去年用过的!但上学期好像因为觉得“太像学号”而改了。或者取中间四位?2308?也不对。她皱眉。学号线索似乎断了,但“0815”这个数字在她心里闪了一下,像颗犹豫的种子。
4. 与特殊事件或数字迷信相关。 她想起六年级毕业时,全班约定用“6666”作恶作剧密码,但她觉得太二没用。或者“8888”,象征发财?她从不信这个。但有一个数字她经常无意识使用:7。她的幸运数字。可能密码里有7?或者全是7?7777?她摇摇头,太极端。也许是7和其他数字的组合。
5. 与上学期最后用的密码相关。 她拼命回想。上学期体育课,她好像用同一个密码开过器材柜……是哪个数字?模糊的印象里,好像有一串数字里有“5”和“0”。50?05?还是15?她痛苦地揉太阳穴。线索太散了。
“所以,你是在进行一场‘自我考古’?”Sophie听她絮叨,总结道。
“差不多。我在挖掘我过去一年的数字习惯。”林小雨在本子上快速写下关键词:
- 生日变形:0912, 1209, 2109, 809?(年份08)
- 父母生日运算:3*18=54, 11*5=55?
- 学号尾巴:0815(旧)
- 幸运数:7(可能组合)
- 模糊印象:含5、0、15
“但这些可能性还是很多啊,”Sophie数了数,“至少二三十个候选了。”
“是的,所以下一步,我需要系统化地列出所有可能的组合,并排除明显不可能的。”林小雨说,这正是问题分解的第二步。
---
**第二步:列出可能组合 (List Possible Combinations)**
“你不能靠‘感觉’去试,”林小雨对本子说,也像对未来的自己立下规矩,“你需要一个清单。一个不会遗漏、也不会重复的清单。”
她开始构建逻辑。
规则一:所有组合必须是四位数字,0-9。 规则二:优先验证与“个人核心信息”高度相关的组合。 她将线索分级:
- **A级(最高可能)**:基于她最常用、最私密信息的变形。
- 生日相关:0912(直接), 1209(月日倒序), 2109(年月倒序?年份08未用,可能08+月日?但四位限制,0812?她突然想到,08(年份后两位)+12(月)?0812?或者09(月)+12(日)?0912已列。她圈出“0812”这个新想法,因为8和1、2都是她喜欢的数字。
- 学号相关:0815(上学期旧密码,她记得改过,但可能没改?列为高可能)。
- 幸运数7:她考虑7在首位、末位或中间。但纯7777可能性低,放弃。考虑7与生日数字组合:比如7091(7+091?),但规则不明。她决定暂不生成无规则的组合,先聚焦有明确来源的。
- **B级(中等可能)**:基于家庭信息运算。
- 妈妈生日运算:3*18=54 → 可能直接用54,但需补位?5454?或者作为部分?她认为密码通常是连续四位,所以54XX或XX54?不确定。她列出“54”作为核心片段。
- 父亲生日:11*5=55 → 同理,列出“55”。
- 但运算结果两位数,如何成四位?可能是重复:5454,5555?或者与其它拼接:比如生日0912和54拼接?091554超了。她意识到,运算结果可能只是密码的一部分,比如后两位是54,前两位是其他。这太复杂,她暂时将“54”、“55”标记为“待组合片段”,优先级调低。
- **C级(低可能)**:模糊印象、常见密码、无规则组合。
- 含5、0、15:她想到1505?0515?5015?这些像日期但不对。或者1055?她列出所有含5和0的四位排列,但数量太多。她决定,除非A、B级全试完,否则不碰C级。
“所以,你的A级清单现在有哪些?”Sophie问。
林小雨数了数写在纸上的: 1. 0912 (生日月日) 2. 1209 (生日日月) 3. 2109 (年月倒序?年份08未用,此条存疑,先保留) 4. 0812 (年份08+月?) 5. 0815 (学号尾巴)
“就五个?”Sophie惊讶,“我以为你会列出几十个。”
“乱列没有意义,”林小雨摇头,心里却知道,这五个里,很可能一个都不对。她上学期“改密码”的记忆很模糊,可能根本就没改,或者改成了完全无关的数字。但这是基于线索的、有穷的列表。计算思维的精髓在于:即使列表最终需要扩大,也必须有一个清晰的、可执行的扩展规则。比如:“如果A级全部失败,则尝试A级数字与幸运数7的所有可能拼接(如7091, 7910等),但限制拼接方式为前两位或后两位,避免组合爆炸。”
她在纸边写下这个“扩展规则”,作为备案。
“这听起来像在编程?”Sophie好奇地问。
“有点像。你在写一个‘验证密码’的函数,输入是候选密码,输出是‘正确’或‘错误’。而‘列出候选’就是这个函数的参数生成部分。你不能让用户随便输入,你需要一个预定义的候选池。”林小雨解释,虽然她自己也只是半懂,但用编程的比喻让她感觉更清晰。
“哇,小雨,你中毒了。”Sophie笑,“但我觉得这个思路靠谱。至少比闭眼乱按强。”
“强,但还不够。”林小雨盯着那五个数字。她需要进入第三步:逐一验证,但要有策略地验证。
---
**第三步:逐一验证 (Verify Systematically)**
“如果你现在就去柜子前,按顺序试0912、1209……”Sophie问。
“那是最低效的。”林小雨说。她想象那个场景:每次输错,柜子“哔”一声,走廊里可能有人侧目。而且,如果前几个都错,她可能会因为挫败感而跳序,或者重复尝试。验证过程本身也需要分解和优化。
她想到了几个原则: 1. 避免重复:必须记录已试组合。她本子有格子,可以打钩。 2. 考虑反馈延迟:每次输入后,柜子需要短暂处理(虽然很快),但连续快速输入可能触发安全锁定?她不确定,但稳妥起见,每次输入后停顿1-2秒,观察指示灯。 3. 心理节奏:如果连续三次错误,暂停,深呼吸,重新核对列表,防止因焦虑而看错数字。 4. 顺序策略:先试A级中最可能的一个。哪个最可能?她认为0815(学号尾巴)可能性最高,因为上学期她确实用过,且“改密码”的记忆可能只是错觉。其次,0912(生日月日)也很直接。她把顺序定为:0815 → 0912 → 1209 → 0812 → 2109。
“所以,你的计划是:带着这个清单,去柜子前,按顺序、有记录地试?”Sophie总结。
“对。而且,如果前五个都错,我才会启动扩展规则,生成带‘7’的组合。但那时,我可能需要更长时间,也许可以放学后再说,或者寻求帮助——比如问问上学期同柜子的同学。”林小雨说。她意识到,问题分解的最终目的,是管理复杂性和不确定性。她不可能穷尽一万种可能,但通过分解,她将“寻找密码”这个模糊任务,变成了“验证A级清单(5个)→ 若失败,生成并验证B级扩展清单(预计不超过20个)→ 若再失败,求助或采用其他策略(如重置)”的清晰路径。每一步都是可管理、可评估的。
“这听起来……很计算机科学。”Sophie若有所思,“就是那种,把大问题切成小块,然后一块块吃掉。”
“Exactly. That's computational thinking.” (“没错。那就是计算思维。”)林小雨微笑,第一次觉得手里这本《算法导论》不是负担,而是工具。
---
校园场景插曲:走廊里的“思维实验”
上课铃尖锐地响起,将走廊的喧嚣瞬间抽走,只剩下急促的脚步声和渐弱的关门声。林小雨和Sophie随着人流向各自的教室移动——林小雨是四班,Sophie是三班,隔壁。
“所以,如果刚才你直接乱试,”Sophie边走边压低声音,用英文说,“what would happen?” (“会怎样?”)
“可能试到第50次才蒙对,或者试了20次都错,心态崩了,把本子扔了,跑去问后勤老师重置柜锁——那需要证明身份,麻烦得多。”林小雨回答,同时用中文补充,“或者,更糟,因为连续错误,锁暂时冻结了,我今天彻底开不了。”
“But with your decomposition, you have a plan. You control the process.” (“但通过分解,你有了计划。你掌控了过程。”)
“是的。而且,我甚至可以在验证第一步时,就收集新信息。”林小雨眼睛一亮,“比如,如果我试0815,错了。那意味着上学期密码不是它,或者我记错了学号尾巴?我可以立刻检查学号牌。如果学号尾巴确实是0815,那说明我上学期肯定改过密码,且改得与学号无关。这立刻缩小了范围,让我更倾向于生日或家庭信息变形。”
“See? Every step, you learn. It's like a feedback loop.” (“看?每一步,你都在学习。这像一个反馈循环。”)
她们在教室门口分开。林小雨走进略显闷热的教室,找到自己靠窗的位置坐下。阳光透过玻璃,在木纹桌面上切出明暗交界。她拿出线圈本,在“0815”后面画了个空钩。计划已定,下一步,执行。
---
验证时刻:柜门前的计算思维实践
课间操时间,校园里响起广播体操的音乐,但林小雨借口肚子疼,留在教室。等人群散去,走廊恢复安静,她拿起本子,走向107号柜。
金属柜门冰凉,编号“107”的贴纸有些卷边。她深吸一口气,像即将执行一段关键代码。
候选1:0815 手指在数字键上悬停。她清晰地输入:0-8-1-5。 “嘀。” 绿灯没亮,红灯闪烁三次,发出短促的“哔——哔——哔——”。 她在本子上“0815”后画了个大大的“×”,并写下:“错。学号0815非密码。确认上学期必改过密码。”
候选2:0912 她停顿两秒,再次输入:0-9-1-2。 “嘀。哔——哔——哔——” 又错了。她有点紧张,手心微汗。在“0912”后打叉,备注:“生日月日直接无效。”
候选3:1209 输入:1-2-0-9。 “哔——哔——哔——” 连续三次错误。走廊尽头的窗户吹来一阵风,吹动了她额前的碎发。她感到一丝凉意,也感到一种奇异的冷静。三次了。按照计划,她应该暂停。她闭上眼,做了个深呼吸。阳光的味道,远处操场的哨声。她重新核对列表:0815、0912、1209都错了。剩下的A级只有0812和2109。
候选4:0812 输入:0-8-1-2。 “哔——哔——哔——” 还是错。她看着本子上四个鲜红的叉,像四道无声的责问。A级全军覆没。计划中,下一步是启动扩展规则:尝试“7”的拼接。但此刻,她脑中却闪过另一个线索:父母生日运算。54和55。如果密码是54XX呢?或者XX54?
她犹豫了。是严格按计划走,还是根据新信息(A级全败)调整策略?这正是计算思维中“评估与迭代” 的体现。她快速权衡:扩展规则“带7的组合”是基于“幸运数”这个较弱线索;而“54/55”是基于家庭信息的运算,虽然她不确定如何拼接,但来源更具体。她决定临时调整优先级:先尝试与“54”相关的组合。
但“54”如何成四位?她列出最合理的猜测:
- 前两位是54:5400, 5401, ... 5499?这太多了,100种,不可行。
- 后两位是54:XX54。那么前两位是什么?她立刻想到A级里剩下的数字:08(年份)、12(月)、09(月)。那么组合:0854, 1254, 0954。还有,她自己的幸运数7?0754?但规则不明。
她意识到,她正在无意识地扩大搜索空间,且有陷入组合爆炸的风险。必须设定边界。她想起李老师的话:“分解后,每一步都要有明确的输入、输出和终止条件。”
她为自己的“验证阶段2”设定新规则: 规则2.1:仅尝试“后两位为54”且“前两位来自已验证错误密码的前两位”的组合。 为什么?因为密码习惯可能具有连贯性。如果她常用生日变形(前两位是09或12),那么密码前两位可能也来自这个集合。已验证的错误密码前两位有:08, 09, 12。所以,只试:0854, 0954, 1254。 另外,如果前两位是“21”(来自2109,虽然2109整体未试,但21作为片段可能独立存在?),她也加上2154。 总共四个,可管理。
规则2.2:若以上全错,则尝试“后两位为55”(父亲生日运算结果),前两位同样来自{08,09,12,21}。 再四个。
“这比乱试一万个强多了。”她喃喃自语,在本子上新建一个分区:“阶段2:基于运算结果片段验证”。
她回到柜子前。
候选5(阶段2-1):0854 输入:0-8-5-4。 “哔——哔——哔——” 错。
候选6:0954 输入:0-9-5-4。 “哔——哔——哔——” 错。她感到一阵沮丧,像在黑暗中又撞了一次墙。但记录已打钩,数据点增加了一个:前两位09+后两位54,无效。
候选7:1254 输入:1-2-5-4。 “哔——哔——哔——** 错。三个了。最后一个来自A级前两位的:2154。
候选8:2154 输入:2-1-5-4。 “哔——哔——哔——** 依然错。阶段2-1全军覆没。她看着本子上新增的四个叉,与前面的四个叉并排。八次错误。走廊安静得能听见远处操场的音乐回声。她几乎能想象柜子内部芯片的冷漠计数。
现在,按规则,进入阶段2-2:后两位55。 候选9:0855 输入:0-8-5-5。 “哔——哔——哔——** 错。
候选10:0955 输入:0-9-5-5。 “哔——哔——哔——** 错。
候选11:1255 输入:1-2-5-5。 “哔——哔——哔——** 错。
候选12:2155 输入:2-1-5-5。 “哔——哔——哔——** 错。
十二次。她靠在柜子上,金属的凉意透过校服衬衫。A级5个 + 阶段2-1(4个)+ 阶段2-2(4个)= 13个候选(她数了数,实际写了12次验证,因为阶段2-1和2-2各4个,但A级5个已试,共13个?她核对:A级5个,阶段2-1四个0854,0954,1254,2154,阶段2-2四个0855,0955,1255,2155,总共13个。本子上13个叉。她试了13次,全部失败。
恐慌像冰冷的蛇,开始缠绕她的心脏。计划失效了。她的分解、她的清单、她的规则,在13次“哔”声后,看起来像个可笑的把戏。她是不是从根本上就错了?密码可能根本不是基于这些线索?可能是一个完全随机的、她开学时随便按的数字?她甚至不记得上周有没有开过柜子!
就在她几乎要放弃,手指无意识地伸向数字键,想随便按一个“7777”了事时,Sophie的声音从身后传来:“嘿,进行得如何?”
林小雨猛地回头。Sophie倚在走廊拐角,抱着一本书,显然一直在“偶然路过”。
“全错了。”林小雨的声音有点哑,“13个都错了。我的计划……失败了。”
Sophie走过来,没有看柜子,而是看着她手里的本子。上面密布的叉和备注。“你试了13个,有逻辑的13个。不是乱试。这已经很了不起了。”
“了不起?我连柜子都打不开。”林小雨苦笑。
“但你已经做了最重要的事,”Sophie用中文说,语气认真,“你把‘打开柜子’这个吓人的大问题,变成了‘验证这13个数字’的小问题。而且,你每试一个,就排