信息学奥赛一本通2065
先看题面。信息学奥输入一个字符,赛本输出用它拼成的信息学奥等腰三角形,底边5个字符,赛本高3行。信息学奥样例清清楚楚,赛本空格和换行一个不多一个不少。信息学奥这题放在任何一本入门教材里都算“送分题”,可《信息学奥赛一本通》偏偏把它编成2065号,夹在一堆排序和递归中间,位置就很微妙——它考的不是你会不会输出,而是你懂不懂“格式”这两个字在OJ里意味着什么。
我第一次提交时,直接写了三个printf,每行手动打空格,自以为天衣无缝。结果WA。当时我盯着屏幕足足愣了十秒,然后才意识到:第二行的空格数量不对。题目要求的是字符前有一个空格,第三行没有空格,可我写成了每行递减两个空格——这就成了“歪脖子”三角形。你瞧,问题从来不是语法,而是观察力。
这道题真正的价值,在于它逼你养成一个习惯:先画图,再写码。拿笔在草稿纸上画一个5列3行的网格,把字符填进去,空格标成“·”,规律瞬间就浮出来了——第i行有(3-i)个前导空格,然后跟着(2i-1)个字符。这个规律一旦抽象出来,代码不过三行循环的事。可大多数初学者跳过了画图这一步,直接凭感觉敲空格,结果就是一遍遍试错。
更妙的是,这题还暗藏了一个陷阱:换行符。有人为了“省事”,在每行末尾多输出一个空格,本地跑起来肉眼根本看不出来,但OJ的比对是逐字符的,一个多余空格就是一次WA。你可能会说,这也太苛刻了吧?可竞赛就是这样,现实世界里的程序输出要给人看,多几个空格无所谓,但机器不这么想——它认死理。
我后来拿这题去问一个刚学编程的朋友,他用了最笨的办法:直接复制样例输出,硬编码。能过吗?能。但这恰恰暴露了问题——他根本没理解输入字符是变量,不是固定的“*”。如果评测数据换成一个字母“A”,他的程序立刻崩盘。这就是2065题的另一层深意:别拿样例当全部,你得想清楚输入和输出之间的映射关系,而不是背答案。
说句实在话,这道题放在《信息学奥赛一本通》里,难度连入门都算不上,但它像一面镜子,照出你做题时是“赶进度”还是“真理解”。我见过有人五分钟AC,也见过有人卡半小时后跑来问我“为啥第二行老是多一个空格”——后者往往没画图,也没检查输出流的每一字节。
最后给你个实在建议:做完这题,别急着翻下一篇。手动改改输入字符,改成数字试试;把三角形倒过来输出试试;把底边长度改成参数化试试。折腾这么一轮,你才算把这5分吃透。毕竟,奥赛考的不是“会”,而是“熟”和“准”——2065这道题,就是给你练“准”的第一道坎。
