题解 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;
}