POJ 1102--LC-Display

代码之美

更新

现在是 2020-08-15,最近在看 Android R 的代码,发现 R 的开发者选项新增了一个功能——显示当前的刷新率。我看了一下实现,惊喜的发现里面刷新率数字的显示用的就是这里面的逻辑,那一刻我真的有一种很强烈的 connecting the dots 的感觉

原文

已经很久没有刷题了。前几天在上 EDA 实验课的时候,突然想到了以前一道没有 AC 的题目,并且突然顿悟,想到了可能是正确的解决方法。然后今天着手实现。总算是 1A 。虽然已经退出了 ACM ,不过 AC 的感觉还是跟以前一样。嗯,我有点怀念以前那段岁月了。

题目描述

题意很简单。就是给你一串数,要你模拟出这串数在 LC 屏幕的输出。不过有一个要求,就是还有一个 size 值。

解决方法

常规的按一个数一个数去输出肯定是不行的,因为你无法让光标向上移动,所以,我们需要按层去输出。例如,我是将其分为 5 层。然后,每一层建立一个数组,然后一层一层的输出。这样就可以了。

代码

#include <stdio.h>
#include <string.h>
#define L 5

char row1[] = {'-', ' ', '-', '-', ' ', '-', '-', '-', '-', '-'};
char row2[] = {'|', '|', ' ', '|', ' ', '|', ' ', '|', '|', '|', '|', ' ', '|', ' ', ' ', '|', '|', '|', '|', '|'};
char row3[] = {' ', ' ', '-', '-', '-', '-', '-', ' ', '-', '-'};
char row4[] = {'|', '|', ' ', '|', '|', ' ', ' ', '|', ' ', '|', ' ', '|', '|', '|', ' ', '|', '|', '|', ' ', '|'};
char row5[] = {'-', ' ', '-', '-', ' ', '-', '-', ' ', '-', '-'};

int main(void)
{
    int times;
    char num[10] = {0};
    int i;
    int j;
    int k;
    int m;
    int n;

    while (scanf("%d%s", &times, num) && times != 0) {
        for (i = 0; i < L; i++) {
            if (i == 0 || i == 2 || i == 4) {
                int len = strlen(num);
                for (j = 0; j < len; j++) {
                    for (k = 0; k < times; k++) {
                        if (k == 0) {
                                putchar(' ');
                        }
                        switch (i) {
                        case 0:
                                printf("%c", row1[num[j] - '0']);
                                break;
                        case 2:
                                printf("%c", row3[num[j] - '0']);
                                break;
                        case 4:
                                printf("%c", row5[num[j] - '0']);
                                break;
                        }
                        if (k == (times - 1)) {
                                putchar(' ');
                        }
                    }
                    printf("%c", (j == len - 1) ? '\n' : ' ');
                }
            } else {
                for (j = 0; j < times; j++) {
                    int len = strlen(num);
                    for (k = 0; k < len; k++) {
                        switch (i) {
                        case 1:
                            printf("%c", row2[(num[k] - '0') * 2 + 0]);
                            break;
                        case 3:
                            printf("%c", row4[(num[k] - '0') * 2 + 0]);
                            break;
                        }
                        for (m = 0; m < times; m++) {
                            putchar(' ');
                        }
                        switch (i) {
                        case 1:
                            printf("%c", row2[(num[k] - '0') * 2 + 1]);
                            break;
                        case 3:
                            printf("%c", row4[(num[k] - '0') * 2 + 1]);
                            break;
                        }
                        printf("%c", (k == (len - 1)) ? '\n' : ' ');
                    }
                }
            }
        }
        putchar(10);
    }

    return 0;
}

EOF

Author: simowce

Permalink: https://blog.simowce.com/LCD-display/

知识共享许可协议
本作品采用 知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议 进行许可。