洛谷P1538 迎春舞会之数字舞蹈
题目背景
HNSDFZ的同学们为了庆祝春节,准备排练一场舞会。
题目描述
在越来越讲究合作的时代,人们注意的更多的不是个人物的舞姿,而是集体的排列。
为了配合每年的倒计时,同学们决定排出——“数字舞蹈”。顾名思义就是所有人一起排成若干个数字 -___-|||| 更为创新的是,每个人都是趴在地上,保证横竖。
现在给出数字及其要求摆出的大小,请你编程,模拟同学们的优美姿态。
输入输出格式
输入格式:
第一行为k。k表示要摆出数字的大小。
第二行为全部由数字组成的字符串,即要摆出的几个数字。
输出格式:
按题目要求输出。
输入样例#1:
2
1234567890
输出样例#1:
-- -- -- -- -- -- -- --
| | | | | | | | | | | | | |
| | | | | | | | | | | | | |
-- -- -- -- -- -- --
| | | | | | | | | | | | |
| | | | | | | | | | | | |
-- -- -- -- -- -- --
说明
除了第一个数字之外,每个数字之前有1个空格,所有数字全部对齐。
k<=30,s的长度不超过255
建议大家直接输出,不要保存。
如果对于大小和k有疑问,请自行理解。
首先,观察样例,不难发现数字的原型
- - - - - - - -
| | | | | | | | | | | | | |
- - - - - - -
| | | | | | | | | | | | |
- - - - - - -
要注意的是,每个数字占五行三列,其中“1”的杠杠都在第三列(因为这个卡了好久www),“0”不能打成了“8”
因为我比较笨,就先考虑怎么输出一个数字
一个数字可以分成五行,两部分,一部分是只有“-”,另一部分只有“|”
输出“-”行:
将第二列重复k次,左右各加一个空格(原数字中的空格),最前面补一个空格
输出“|”行:
第二列时补 k-1 个空格,左右输出第一,三列,最前面补一个空格,如此重复输出k行
注意不要将要求输出的数字间空格和储存数字的五行三列中自带的空格弄混
最后别忘了第一个数字前不输出空格!!!
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
char a[10][5][10];
void pre()
{
memset(a, ' ', sizeof(a));
//0
a[0][1][2] = a[0][5][2] = '-';
a[0][2][1] = a[0][2][3] = a[0][4][1] = a[0][4][3] = '|';
//1
a[1][2][3] = a[1][4][3] = '|';//1的两杠都是在右边!!!!!
//2
a[2][1][2] = a[2][3][2] = a[2][5][2] = '-';
a[2][2][3] = a[2][4][1] = '|';
//3
a[3][1][2] = a[3][3][2] = a[3][5][2] = '-';
a[3][2][3] = a[3][4][3] = '|';
//4
a[4][2][1] = a[4][2][3] = a[4][4][3] = '|';
a[4][3][2] = '-';
//5
a[5][1][2] = a[5][3][2] = a[5][5][2] = '-';
a[5][2][1] = a[5][4][3] = '|';
//6
a[6][1][2] = a[6][3][2] = a[6][5][2] = '-';
a[6][2][1] = a[6][4][3] = a[6][4][1] = '|';
//7
a[7][1][2] = '-';
a[7][2][3] = a[7][4][3] = '|';
//8
a[8][1][2] = a[8][3][2] = a[8][5][2] = '-';
a[8][2][1] = a[8][2][3] = a[8][4][1] = a[8][4][3] = '|';
//9
a[9][1][2] = a[9][3][2] = a[9][5][2] = '-';
a[9][2][1] = a[9][2][3] = a[9][4][3] = '|';
}
void print(int x, int k)//单个数字输出
{
for(int i = 1; i <= 5; ++i)
{
if(i % 2 == 1)
{
for(int j = 1; j <= 3; ++j)
{
for(int t = 1; t <= k; ++t)
{
printf("%c", a[x][i][j]);
}
}
printf("\n");
}
else
{
for(int t = 1; t <= k; ++t)
{
for(int j = 1; j <= 3; ++j)
{
if(j != 3)//空格输在中间不会错
{
for(int p = 1; p <= k-1; ++p)
{
printf(" ");
}
}
printf("%c", a[x][i][j]);
}
printf("\n");
}
}
}
}
int main(){
//freopen("a.txt", "w", stdout);
pre();
int k;
string s;
scanf("%d", &k);
cin>>s;
int l = s.size();
//1
for(int i = 0; i < l; ++i)
{
if(i)
{
printf(" ");
}
printf(" ");
for(int t = 1; t <= k; ++t)
{
printf("%c", a[s[i]-'0'][1][2]);
}
printf(" ");
}
printf("\n");
//2
for(int t = 1; t <= k; ++t)
{
for(int i = 0; i < l; ++i)
{
if(i)
printf(" ");
for(int j = 1; j <= 3; ++j)
{
if(j == 2)//空格输在中间不会错
{
for(int p = 1; p <= k-1; ++p)
{
printf(" ");
}
}
printf("%c", a[s[i]-'0'][2][j]);
}
}
printf("\n");
}
//3
for(int i = 0; i < l; ++i)
{
if(i)
{
printf(" ");
}
printf(" ");
for(int t = 1; t <= k; ++t)
{
printf("%c", a[s[i]-'0'][3][2]);
}
printf(" ");
}
printf("\n");
//4
for(int t = 1; t <= k; ++t)
{
for(int i = 0; i < l; ++i)
{
if(i)
printf(" ");
for(int j = 1; j <= 3; ++j)
{
if(j == 2)//空格输在中间不会错
{
for(int p = 1; p <= k-1; ++p)
{
printf(" ");
}
}
printf("%c", a[s[i]-'0'][4][j]);
}
}
printf("\n");
}
//5
for(int i = 0; i < l; ++i)
{
if(i)
{
printf(" ");
}
printf(" ");
for(int t = 1; t <= k; ++t)
{
printf("%c", a[s[i]-'0'][5][2]);
}
printf(" ");
}
printf("\n");
return 0;
}