为每个数字预存 3x5 点阵模板,按行拼接所有数字并用点列分隔。
OJ: luogu
题目 ID: P5730
难度:入门
标签:模拟字符串python
日期: 2026-07-15 18:48
题意
给出一串数字,把每个数字显示成 3 * 5 的点阵。数字之间用一列 . 隔开,最终输出 5 行。
思路
先把 0..9 每个数字的五行模板存起来。例如 0 是:
text
XXX
X.X
X.X
X.X
XXX输出时不要一个数字一个数字竖着输出,而是按行拼接:
- 枚举点阵的第
row行,row = 0..4; - 取出每个数字模板的第
row行; - 用
".".join(...)在数字之间插入一列间隔点; - 输出这一整行。
这题是字符串模板拼接,不创建 brute.py。
Python 知识
/home/rainboy/mycode/hugo-blog/content/program_language/python/input_output_and_strings.md:本题用字符串列表和".".join(...)拼接输出。/home/rainboy/mycode/hugo-blog/content/program_language/python/oj_input_output_cheatsheet.md:读取一串数字时用input().strip()保留每个字符。- 字典
patterns[digit]可以通过字符数字找到对应模板。 - 列表推导式
[patterns[digit][row] for digit in digits]收集同一行的所有数字片段。
代码
python
digit_count = int(input())
digits = input().strip()
patterns = {
"0": ["XXX", "X.X", "X.X", "X.X", "XXX"],
"1": ["..X", "..X", "..X", "..X", "..X"],
"2": ["XXX", "..X", "XXX", "X..", "XXX"],
"3": ["XXX", "..X", "XXX", "..X", "XXX"],
"4": ["X.X", "X.X", "XXX", "..X", "..X"],
"5": ["XXX", "X..", "XXX", "..X", "XXX"],
"6": ["XXX", "X..", "XXX", "X.X", "XXX"],
"7": ["XXX", "..X", "..X", "..X", "..X"],
"8": ["XXX", "X.X", "XXX", "X.X", "XXX"],
"9": ["XXX", "X.X", "XXX", "..X", "XXX"],
}
for row in range(5):
line = [patterns[digit][row] for digit in digits]
print(".".join(line))cpp
/**
* Author by Rainboy blog: https://rainboylv.com github: https://github.com/rainboylvx
* rbook: -> https://rbook.roj.ac.cn https://rbook2.roj.ac.cn
* rainboy的学习导航网站: https://idx.roj.ac.cn
* create_at: 2026-07-27 00:00
* update_at: 2026-07-27 00:00
*/
#include <bits/stdc++.h>
using namespace std;
// 每个数字 0~9 的 5 行 3 列点阵模板
char pat[10][5][4] = {
{"XXX", "X.X", "X.X", "X.X", "XXX"}, // 0
{"..X", "..X", "..X", "..X", "..X"}, // 1
{"XXX", "..X", "XXX", "X..", "XXX"}, // 2
{"XXX", "..X", "XXX", "..X", "XXX"}, // 3
{"X.X", "X.X", "XXX", "..X", "..X"}, // 4
{"XXX", "X..", "XXX", "..X", "XXX"}, // 5
{"XXX", "X..", "XXX", "X.X", "XXX"}, // 6
{"XXX", "..X", "..X", "..X", "..X"}, // 7
{"XXX", "X.X", "XXX", "X.X", "XXX"}, // 8
{"XXX", "X.X", "XXX", "..X", "XXX"} // 9
};
int n;
char s[1005];
int main() {
cin >> n >> s;
// 按行输出,每行依次输出每个数字的对应行,用点隔开
for (int r = 0; r < 5; r++) {
for (int i = 0; i < n; i++) {
int d = s[i] - '0';
cout << pat[d][r];
if (i != n - 1) cout << "."; // 数字之间插一列点
}
cout << "\n";
}
return 0;
}Pythonic 写法
字典图案 + join:
python
input()
digits = input().strip()
P = {
'0': ['XXX', 'X.X', 'X.X', 'X.X', 'XXX'],
'1': ['..X'] * 5,
'2': ['XXX', '..X', 'XXX', 'X..', 'XXX'],
'3': ['XXX', '..X', 'XXX', '..X', 'XXX'],
'4': ['X.X', 'X.X', 'XXX', '..X', '..X'],
'5': ['XXX', 'X..', 'XXX', '..X', 'XXX'],
'6': ['XXX', 'X..', 'XXX', 'X.X', 'XXX'],
'7': ['XXX', '..X', '..X', '..X', '..X'],
'8': ['XXX', 'X.X', 'XXX', 'X.X', 'XXX'],
'9': ['XXX', 'X.X', 'XXX', '..X', 'XXX'],
}
for row in range(5):
print('.'.join(P[d][row] for d in digits))复杂度
设数字位数为 n。一共输出 5 行,每行拼接 n 个片段,时间复杂度是
总结
显示屏题的核心是“按行拼接模板”。先把每个数字的五行写成数据,输出时只负责取模板和拼接,逻辑会很稳定。