题目要求我们将一个只由数字 0, 1, 2, 3 组成的非负整数 (n),转换为对应的图形表示。每个数字都是一个固定的 (5 \times 5) 字符网格,且不同数字的网格形状已经在题面中给出。
例如,数字 0 的图案是:
.....
.***.
.***.
.***.
.....
我们需要将输入数字的每一位对应的图案按顺序拼接在同一行中,一共输出 5 行。也就是说,最终输出的是宽度为 5 × 数字位数、高度为 5 的字符画。
这道题的本质是字符串处理。因为图案的高度固定为 5 行,我们可以逐行生成输出内容:
row 表示当前行号,从 0 到 4 共 5 行。'0':
".....";".***."。'1':
"****."。'2':
".....";"****.";".....";".****";"....."。'3':
".....";"****.";".....";"****.";"....."。由于输入中只包含 0,1,2,3,我们不需要处理其他字符。
我们可以预先将每个数字的五行图案存储在字符串数组中,这样代码会更加简洁清晰,也更容易维护。具体步骤如下:
pattern[4][5],其中 pattern[d][row] 表示数字 d 的第 row 行字符串。string 读入整数 (n)。row 从 0 到 4:
c,将对应数字 c - '0' 的 pattern 拼接到当前行字符串末尾。这个做法避免了大量 if-else 判断,让代码逻辑更清晰。
string 的 += 运算符,总拼接长度为 (5 \times 5 \times L = O(L)),总复杂度为 (O(L))。由于 (n \le 10^6),(L) 最大约为 7,对于任何数据规模都能在极短时间内完成。
下面给出一种更加清晰的 C++ 实现:
cpp1#include <iostream> 2#include <string> 3using namespace std; 4 5int main() { 6 // 预先存储 0, 1, 2, 3 四个数字的 5 行图案 7 string pattern[4][5] = { 8 // 数字 0 9 {".....", 10 ".***.", 11 ".***.", 12 ".***.", 13 "....."}, 14 // 数字 1 15 {"****.", 16 "****.", 17 "****.", 18 "****.", 19 "****."}, 20 // 数字 2 21 {".....", 22 "****.", 23 ".....", 24 ".****", 25 "....."}, 26 // 数字 3 27 {".....", 28 "****.", 29 ".....", 30 "****.", 31 "....."} 32 }; 33 34 string n; 35 cin >> n; 36 37 // 逐行输出 38 for (int row = 0; row < 5; ++row) { 39 string line = ""; 40 for (char digit : n) { 41 // 将字符转换为数字索引 42 int d = digit - '0'; 43 line += pattern[d][row]; 44 } 45 cout << line << endl; 46 } 47 48 return 0; 49}
pattern[4][5] 是一个二维字符串数组,第一维表示数字编号(0~3),第二维表示该数字的第几行(0~4)。row 循环控制输出第几行。digit,通过 digit - '0' 将字符转为整数 d,再取出 pattern[d][row] 拼接到 line 末尾。本题主要考察对字符串的处理能力,以及对图案逐行拼接的理解。通过预先存储每个数字的标准图案,可以避免复杂的条件判断,使代码更加简洁易读。对于类似“输出多位数字字符画”的题目,都可以采用这种逐行生成、预存模板的思路来解决。