【洛谷 P1583】迎春舞会之数字舞蹈
2018-10-04 本文已影响0人
Siding
迎春舞会之数字舞蹈(题目链接)
方法
- 将大小为1的数字保存在数组中
- 输出时,将根据大小变化的位置循环输出
- 具体实现及解释详见代码中
代码
#include <iostream>
#include <string>
using namespace std;
/*大小为2时,每个数字的宽度为4,高为7,数字2的表示如下(.表示空格)
.--.
...|
...|
.--.
|...
|...
.--.
*所以当大小为1时,宽度为3,高为5(#为数字之间的分隔符)
* 0 1 2 3 4 5 6 7 8 9
* # - # # - # - # # - # - # - # - # - #
* #| |# |# |# |#| |#| #| # |#| |#| |#
* # # # - # - # - # - # - # # - # - #
* #| |# |#| # |# |# |#| |# |#| |# |#
* # - # # - # - # # - # - # # - # - #
*/
string tab[6] = {"",/*0 1 2 3 4 5 6 7 8 9*/
" - - - - - - - - ", //1
"| | | | | | | | | | | | | | ", //2
" - - - - - - - ", //3
"| | | | | | | | | | | | | ", //4
" - - - - - - - " //5
};
int main(){
int k, len, t1, t2;
string num;
cin >> k >> num; //输入数据
len = num.length(); //字符串的长度
for(int x = 1; x < 6; x++){ //循环输出5行
if(x%2 == 0){ //若为第2行或者第4行
t1 = k; //该行的循环次数改为k次
}else{ //否则
t1 = 1; //循环次数为1次
}
for(int i = 0; i < t1; i++){ //循环t1次
for(int pos = 0; pos < len; pos++){ //循环输出每个字符
for(int y = 0; y < 4; y++){ //最小字符宽度为4
int tmp = (num[pos] - '0') * 4 + y; //计算在tab中的位置
if(tmp%4 == 1){ //若为字符的第2个位置
t2 = k; //该行循环k次
}else{ //否则
t2 = 1; //循环1次
}
for(int j = 0; j < t2; j++){ //循环t2次
cout << tab[x][tmp]; //输出计算后的字符
}
}
}
cout << endl; //输出换行
}
}
return 0;
}