文章

【GESP】C++四级练习 luogu-P5730 【深基5.例10】显示屏

GESP C++四级,多维(二维)数组应用练习,难度⭐⭐★☆☆。

luogu-P5730 【深基5.例10】显示屏

题目要求

题目描述

液晶屏上,每个阿拉伯数字都是可以显示成 $3\times5$ 的点阵的(其中 X 表示亮点,. 表示暗点)。现在给出数字位数(不超过 $100$)和一串数字,要求输出这些数字在显示屏上的效果。数字的显示方式如同样例输出,注意每个数字之间都有一列间隔。

输入格式

第一行输入一个正整数 $n$,表示数字的位数。

第二行输入一个长度为 $n$ 的自然数。

输出格式

输出五行,表示显示屏上的数字。

输入输出样例 #1

输入 #1

1
2
10
0123456789

输出 #1

1
2
3
4
5
XXX...X.XXX.XXX.X.X.XXX.XXX.XXX.XXX.XXX
X.X...X...X...X.X.X.X...X.....X.X.X.X.X
X.X...X.XXX.XXX.XXX.XXX.XXX...X.XXX.XXX
X.X...X.X.....X...X...X.X.X...X.X.X...X
XXX...X.XXX.XXX...X.XXX.XXX...X.XXX.XXX

说明/提示

数据保证,$1 \leq n \leq 100$。


题目分析

解题思路

本题的解题思路如下:

  1. 数据结构设计
    • 使用二维字符串数组存储数字显示样式
    • 数组大小为 5×10,对应每个数字的 3×5 显示区域
    • 每个数字之间需要一列间隔
  2. 初始化显示样式
    • 需要初始化0-9十个数字的显示样式
    • 每个数字由 “X” 和 “.” 组成
    • 使用二维数组 array[5][10] 存储
  3. 输入处理
    • 读入数字位数 $n$
    • 读入 $n$ 位数字字符串
    • 数据范围:$1 \leq n \leq 100$
  4. 输出实现
    • 按行输出,共5行
    • 每行需要遍历所有数字
    • 每个数字之间添加一个 “.” 作为间隔
    • 每行末尾换行
  5. 算法分析
    • 时间复杂度:$O(n)$
      • $n$为数字位数
      • 每个数字需要输出固定大小的显示样式
    • 空间复杂度:$O(1)$
      • 使用固定大小的二维数组存储显示样式
      • 输入字符串最大长度为$100$


示例代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
#include <iostream>

// 定义5x10的字符串数组,用于存储0-9数字的显示样式
std::string array[5][10];
int main() {
    // 数字0的显示样式
    array[0][0] = "XXX";
    array[1][0] = "X.X";
    array[2][0] = "X.X";
    array[3][0] = "X.X";
    array[4][0] = "XXX";

    // 数字1的显示样式
    array[0][1] = "..X";
    array[1][1] = "..X";
    array[2][1] = "..X";
    array[3][1] = "..X";
    array[4][1] = "..X";

    // 数字2的显示样式
    array[0][2] = "XXX";
    array[1][2] = "..X";
    array[2][2] = "XXX";
    array[3][2] = "X..";
    array[4][2] = "XXX";

    // 数字3的显示样式
    array[0][3] = "XXX";
    array[1][3] = "..X";
    array[2][3] = "XXX";
    array[3][3] = "..X";
    array[4][3] = "XXX";

    // 数字4的显示样式
    array[0][4] = "X.X";
    array[1][4] = "X.X";
    array[2][4] = "XXX";
    array[3][4] = "..X";
    array[4][4] = "..X";

    // 数字5的显示样式
    array[0][5] = "XXX";
    array[1][5] = "X..";
    array[2][5] = "XXX";
    array[3][5] = "..X";
    array[4][5] = "XXX";

    // 数字6的显示样式
    array[0][6] = "XXX";
    array[1][6] = "X..";
    array[2][6] = "XXX";
    array[3][6] = "X.X";
    array[4][6] = "XXX";

    // 数字7的显示样式
    array[0][7] = "XXX";
    array[1][7] = "..X";
    array[2][7] = "..X";
    array[3][7] = "..X";
    array[4][7] = "..X";

    // 数字8的显示样式
    array[0][8] = "XXX";
    array[1][8] = "X.X";
    array[2][8] = "XXX";
    array[3][8] = "X.X";
    array[4][8] = "XXX";

    // 数字9的显示样式
    array[0][9] = "XXX";
    array[1][9] = "X.X";
    array[2][9] = "XXX";
    array[3][9] = "..X";
    array[4][9] = "XXX";

    // 读入数字的位数
    int n;
    std::cin >> n;

    // 读入n位数字字符串
    std::string str;
    std::cin >> str;

    // 按行输出数字的显示效果
    for (int i = 0; i < 5; i++) {
        for (int j = 0; j < n; j++) {
            // 输出当前数字的当前行
            std::cout << array[i][str[j] - '0'];
            // 除了最后一个数字,每个数字后面都要加一个点
            if (j != n - 1) {
                std::cout << ".";
            }
        }
        // 每行结束换行
        std::cout << "\n";
    }
    return 0;
}

所有代码已上传至Github:https://github.com/lihongzheshuai/yummy-code

GESP各级别考纲、真题讲解、知识拓展和练习清单等详见【置顶】【GESP】C++ 认证学习资源汇总

luogu-”系列题目已加入洛谷Java、C++初学团队作业清单,可在线评测,团队名额有限。

bcqm-”系列题目可在编程启蒙题库进行在线评测。

欢迎加入Java、C++、Python技术交流QQ群(982860385),大佬免费带队,有问必答

欢迎加入C++ GESP/CSP认证学习QQ频道,考试资源总结汇总

欢迎加入C++ GESP/CSP学习交流QQ群(688906745),考试认证学员交流,互帮互助

GESP/CSP 认证学习微信公众号
GESP/CSP 认证学习微信公众号
本文由作者按照 CC BY 4.0 进行授权