B4067 题解

· · 题解

因个人原因本蒟蒻未能参加本次GESP三级,但在考完第一时间写了这道题

先来读题,发现本题很水考察字符串等知识点

但是本蒟蒻一开始不懂发什么神经想偏了,用了亿个if else,这个写法肥肠不推荐使用,逻辑较复杂:

#include <bits/stdc++.h>
using namespace std;
int a[10];

int main()
{
    int n,k = 1;
    scanf("%d",&n);
    if(n == 0){
        printf(".....\n");
        printf(".***.\n");
        printf(".***.\n");
        printf(".***.\n");
        printf(".....\n");
    }
    while(n > 0){
        a[k] = n % 10;
        n /= 10;
        k ++;
    }
    k --;
    for(int i = 1;i <= 5;i ++){
        for(int j = k;j >= 1;j --){
            if(a[j] == 0){
                if(i == 1 || i == 5) printf(".....");
                else printf(".***.");
            }
            else if(a[j] == 1) printf("****.");
            else if(a[j] == 2){
                if(i == 1 || i == 3 || i == 5) printf(".....");
                else if(i == 2) printf("****.");
                else printf(".****");
            }
            else if(a[j] == 3){
                if(i == 1 || i == 3 || i == 5) printf(".....");
                else printf("****.");
            }
        }
        printf("\n");
    }

    return 0;
}

那有没有更加优雅的写法呢?很简单,二维打表!

#include <bits/stdc++.h>
using namespace std;

string s[4][5] = {
    {".....",".***.",".***.",".***.",".....",},
    {"****.","****.","****.","****.","****.",},
    {".....","****.",".....",".****",".....",},
    {".....","****.",".....","****.",".....",},
};

int main() {

    int n;
    cin >> n;
    string s2 = to_string(n);
    for(int i = 0; i < 5 ; i++){
        for(int j = 0;j < s2.size();j++){
            if (str[j] == '0') cout << s[0][i];
            if (s2[j] == '1') cout << s[1][i];
            if (s2[j] == '2') cout << s[2][i];
            if (s2[j] == '3') cout << s[3][i];
        }       
        cout << "\n";
    }

    return 0;
}

很多小萌新可能布吉岛to_string是什么,这里科普一下,是把整型转换为string类型。至于为什么不转成char,是因为我觉得string更加方便

总的来说,我们肯定要一行一行的打印,按照题目所给的数字一一对应。大体思路很简单,就是考察码力