【深基5.例10】显示屏

GitHub跳转原题关系图返回列表

为每个数字预存 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

输出时不要一个数字一个数字竖着输出,而是按行拼接:

  1. 枚举点阵的第 row 行,row = 0..4
  2. 取出每个数字模板的第 row 行;
  3. ".".join(...) 在数字之间插入一列间隔点;
  4. 输出这一整行。

这题是字符串模板拼接,不创建 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 个片段,时间复杂度是 O(n)O(n),模板空间为常数,输出行空间是 O(n)O(n)

总结

显示屏题的核心是“按行拼接模板”。先把每个数字的五行写成数据,输出时只负责取模板和拼接,逻辑会很稳定。