您的位置:首页 > 其它

洛谷在线测试P1538迎春舞会之数字舞蹈

2016-08-17 07:48 190 查看
/*
Name:
Copyright:
Author: 巧若拙
Date: 16/08/16 21:12
Description:  P1538迎春舞会之数字舞蹈

HNSDFZ的同学们为了庆祝春节,准备排练一场舞会。
题目描述

在越来越讲究合作的时代,人们注意的更多的不是个人物的舞姿,而是集体的排列。

为了配合每年的倒计时,同学们决定排出——“数字舞蹈”。顾名思义就是所有人一起排成若干个数字 -___-|||| 更为创新的是,每个人都是趴在地上,保证横竖。

现在给出数字及其要求摆出的大小,请你编程,模拟同学们的优美姿态。

输入输出格式

输入格式:
第一行为k。k表示要摆出数字的大小。

第二行为全部由数字组成的字符串,即要摆出的几个数字。

输出格式:
按题目要求输出。

输入输出样例

输入样例#1:
2
1234567890
输出样例#1:
--   --        --   --   --   --   --   --
|    |    | |  | |    |       | |  | |  | |  |
|    |    | |  | |    |       | |  | |  | |  |
--   --   --   --   --        --   --
| |       |    |    | |  |    | |  |    | |  |
| |       |    |    | |  |    | |  |    | |  |
--   --        --   --        --   --   --
说明

每个数字之前有1个空格,所有数字全部对齐。

k<=30,s的长度不超过255

建议大家直接输出,不要保存。

如果对于大小和k有疑问,请自行理解。

评测结果:Accepted
得分:  100
提交时间:2016-08-17 07:00 耗时:8ms
内存:18375kb

算法思路一:
用一个二维数组模拟七段管来表示每个数字,下标0-9分别表示数字0-9.
为了便于输出,特设置七段管顺序为:
1
0  2
3
4  6
5
即下标1,3,5分别对应第1,3,5行的"-"符号,第2行包括下标为0,2的"|"符号,第4行包括下标为4,6的"|"符号。
七段管共5行,依次输出七段管的每一行,并用空格把字符串中的每个数字用空格隔开(确保能在同一行中输出全部字符串)
如果是七段管第1,3,5行,输出size个"-"符号;如果是七段管第2,4行,输出size行"|"符号(中间还有size个空格)。
*/
#include<iostream>
#include<vector>
#include<string>

using namespace std;

void PrintNum(int num, int size, int row);
//七段管顺序为
// 1
//0  2
// 3
//4  6
// 5
char numLib[10][8] = {"|-| |-|","  |   |", " -|-|- ", " -|- -|", "| |-  |", "|- - -|", "|- -|-|", " -|   |", "|-|-|-|", "|-|- -|"};

int main()
{
int size;
string num;

cin >> size;
cin >> num;

for (int row=1; row<=5; row++)//依次输出七段管的每一行
{
if (row % 2 == 1)//第1,3,5行
{
for (int i=0; i<num.size(); i++)
{
PrintNum(num[i]-'0', size, row);
cout << ' ';
}
cout << endl;
}
else //第2,4行
{
for (int i=0; i<size; i++) //共size行"|"
{
for (int i=0; i<num.size(); i++)
{
PrintNum(num[i]-'0', size, row);
cout << ' ';
}
cout << endl;
}
}
}

return 0;
}

void PrintNum(int num, int size, int row)//打印七段管的每一行
{
if (row % 2 == 1)//第1,3,5行
{
cout << ' ';
for (int i=0; i<size; i++)
{
cout << numLib[num][row]; //下标1,3,5分别对应第1,3,5行的"-"符号
}
cout << ' ';
}
else if (row == 2)//第2行 ,包括下标为0,2的"|"符号
{
cout << numLib[num][0];
for (int i=0; i<size; i++)
{
cout << ' ';
}
cout << numLib[num][2];
}
else //第4行 ,包括下标为4,6的"|"符号
{
cout << numLib[num][4];
for (int i=0; i<size; i++)
{
cout << ' ';
}
cout << numLib[num][6];
}
}
/*
算法思路二: (比方法一更为直观的思路,代码也更简洁)
用5个字符串分别模拟七段管的1-5行来表示每个数字。
其中第1,3,5行每个数字只有一个符号"-" 或" ",下标0-9分别表示数字0-9;
第2,4行每个数字有两个符号"|"或" ",下标i*2和i*2+1分别表示数字i在该行的两个符号。
分别用两个不同的函数来输出第1,3,5行和第2,4行。
*/
#include<iostream>
#include<vector>
#include<string>

using namespace std;

void PrintRow_1_3_5(const string ROW, const string numStr, int size);//打印七段管的第1,3,5行
void PrintRow_2_4(const string ROW, const string numStr, int size);//打印七段管的第2,4行

//分别表示七段管0-9个数字在1-5行中对应位置的符号,其中第1,3,5行每个数字只有一个符号"-" 或" ";第2,4行每行有两个符号"|"或" "。
const string ROW_1 = "- -- -----";
const string ROW_2 = "|| | | |||| |  |||||";
const string ROW_3 = "  ----- --";
const string ROW_4 = "|| ||  | | ||| ||| |";
const string ROW_5 = "- -- -- --";

int main()
{
int size;
string numStr;

cin >> size;
cin >> numStr;

//依次输出七段管的每一行
PrintRow_1_3_5(ROW_1, numStr, size);
PrintRow_2_4(ROW_2, numStr, size);
PrintRow_1_3_5(ROW_3, numStr, size);
PrintRow_2_4(ROW_4, numStr, size);
PrintRow_1_3_5(ROW_5, numStr, size);

return 0;
}

void PrintRow_1_3_5(const string ROW, const string numStr, int size)//打印七段管的第1,3,5行
{
int len = numStr.size();
for (int i=0; i<len; i++)
{
cout << ' ';
for (int j=0; j<size; j++) //输出size个"-" 或" "
{
cout << ROW[numStr[i]-'0'];
}

cout << ' ' << ' ';
}
cout << endl;
}

void PrintRow_2_4(const string ROW, const string numStr, int size)//打印七段管的第2,4行
{
int len = numStr.size();
for (int j=0; j<size; j++) //输出size行"|"或 " "
{
for (int i=0; i<len; i++)
{
int pos = (numStr[i]-'0') * 2;
cout << ROW[pos];

for (int k=0; k<size; k++)//输出size个空格
{
cout << ' ';
}

cout << ROW[pos+1];
cout << ' ';
}
cout << endl;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: