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

/*
  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;
	}
} 


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值