题解 P1538 【迎春舞会之数字舞蹈】

· · 题解

第一感觉是NOIP不会考的题目,第二感觉就是因为k的存在让此题有些意思。

每个数字是用最多7根线摆出来的。先考虑如何来保存0-9这些数字的信息,

首先想到用一个[10][7]的bool数组,保存哪些位置有线,哪些没有。

但代码中判断0和1的同时,还需要判断是横线还是竖线,所以又想到可以用一个字符串数组来保存。

比如数字8就是“-||-||-”,顺序是从上至下,从左至右。而1则是“ | | ”,空位用空格占位。 接下来开始打印,这个打印过程有些像是针式打印机打印的过程。

一共可以分成两种情况,打印横线和打印竖线。横线的是后是0、3、6这三位,刚好可以对3取余来判断。

竖线打印的时候要一下打印两条竖线,所以处理1,4的时候把2、5也解决了。

最后就是控制循环打印k个空格或者k条横线或竖线了。参考代码:

#include <bits/stdc++.h>
using namespace std;
int main()
{
    int k;
    string s,m[10]={"-|| ||-","  |  | ","- |-| -",
    "- |- |-"," ||- | ",    "-| - |-","-| -||-",
    "- |  | ","-||-||-","-||- |-"};
    cin>>k>>s;
    for (int p=0;p<7;p++){
        if (p==2 || p==5) continue;
        if (p%3==0){
            for (int i=0;i<s.size();i++){
                cout<<' ';
                for (int j=0;j<k;j++){
                    cout<<m[s[i]-48][p];
                }
                cout<<"  ";
            }
            cout<<endl;        
        }else{
            for(int q=0;q<k;q++){
                for (int i=0;i<s.size();i++){
                    cout<<m[s[i]-48][p];
                    for (int j=0;j<k;j++){
                        cout<<' ';
                    }
                    cout<<m[s[i]-48][p+1]<<' ';
                }
                cout<<endl;
            }
        }
    }
    return 0;
}