被gank的openjudge2745

C++实验的一道题,有点复杂的模拟,思路很简单,但是在我校oj上一直过不了,连个PE都不给我,害的我dubug了好久,然后去poj上交了,ac,,,莫非是数据的锅。。

传送门:http://bailian.openjudge.cn/practice/2745/

总时间限制:
1000ms
内存限制:
65536kB

描述
你的一个朋友买了一台电脑。他以前只用过计算器,因为电脑的显示器上显示的数字的样子和计算器是不一样,所以当他使用电脑的时候会比较郁闷。为了帮助他,你决定写一个程序把在电脑上的数字显示得像计算器上一样。
输入
输入包括若干行,每行表示一个要显示的数。每行有两个整数s和n (1 <= s <= 10, 0 <= n <= 99999999),这里n是要显示的数,s是要显示的数的尺寸。

如果某行输入包括两个0,表示输入结束。这行不需要处理。

输出
显示的方式是:用s个’-‘表示一个水平线段,用s个’|’表示一个垂直线段。这种情况下,每一个数字需要占用s+2列和2s+3行。另外,在两个数字之间要输出一个空白的列。在输出完每一个数之后,输出一个空白的行。注意:输出中空白的地方都要用空格来填充。
样例输入

2 12345
3 67890
0 0

样例输出

      --   --        -- 
   |    |    | |  | | 
   |    |    | |  | | 
      --   --   --   -- 
   | |       |    |    |
   | |       |    |    |
      --   --        -- 

 ---   ---   ---   ---   --- 
|         | |   | |   | |   |
|         | |   | |   | |   |
|         | |   | |   | |   |
 ---         ---   --- 
|   |     | |   |     | |   |
|   |     | |   |     | |   |
|   |     | |   |     | |   |
 ---         ---   ---   ---

提示
数字(digit)指的是0,或者1,或者2……或者9。
数(number)由一个或者多个数字组成。

提题意很简单,就是将数字用火柴棒来表示,因为数字8是包含了所有数字的形状的,而8是由七根火柴棒(图是盗的)组成的,可以看出,对一个数字来说,每一行仅有3种出现形式,-(|)或者空格,所以只需要判断根据火柴棒的位置然后按行输出就行了判断一下就OK了,用数组来保存每一个数字在7个位置出现的情况:
这是我到的图(逃)

char n1[11]={"- -- -----"};//笔画1 0,2,3,5,6,7,8,9
                 {"|   ||| ||"};//笔画2 0,4,5,6,8,9 
                 {"|||||  |||"};//笔画3 0,1,2,3,4,7,8,9 
                 {"  ----- --"};//笔画4 2,3,4,5,6,8,9 
                 {"| |   | | "};//笔画5 0,2,6,8
                 {"|| |||||||"};//笔画6 0,1,3,4,5,6,7,8,9 
                 {"- -- -- --"};//笔画7 0,2,3,5,6,8,9 

需要注意的是最后一个数字后面不要输出空列,不然PE。

AC代码:

/*
    title:C++实验:显示器
    description:模拟
    author: averyboy
    time:2017/3/22
    version:1.00
*/
#include<cstdio>
#include<iostream>
//#include<algorithm>
#include<cstring>
#include<string>
#include<cmath>
#include<map>
#include<set>
#include<cctype>
#include<ctime>
#define INF 0x3f3f3f3f3
#define PI acos(-1.0)
using namespace std;
char num[7][10] = {{'-',' ','-','-',' ','-','-','-','-','-'},{'|',' ',' ',' ','|','|','|',' ','|','|'},{'|','|','|','|','|',' ',' ','|','|','|'},{' ',' ','-','-','-','-','-',' ','-','-'},{'|',' ','|',' ',' ',' ','|',' ','|',' '},{'|','|',' ','|','|','|','|','|','|','|'},{'-',' ','-','-',' ','-','-',' ','-','-'}};
void print(int s,int *str,int t)
{
//    for(int i=t-1;i>=0;i--)
//        cout<<str[i];
   int i,j,k;//i:第i行,j:第j个数,k:控制输出个数,t:位数
   for(i=0;i<2*s+3;i++)
   {
        for(j=t-1;j>=0;j--)
        {
            if(i==0)
            {
                cout<<' ';
                for(k=1;k<s+1;k++)
                {
                    cout<<num[0][str[j]];
                }
                cout<<' ';
                if(j>0)
                    cout<<' ';
            }
           else if(i==s+1)
            {
                cout<<' ';
                for(k=1;k<s+1;k++)
                {
                    cout<<num[3][str[j]];
                }
                cout<<' ';
                 if(j>0)
                    cout<<' ';
            }
            else if(i==2*s+2)
            {
                cout<<' ';
                for(k=1;k<s+1;k++)
                {
                    cout<<num[6][str[j]];
                }
                cout<<' ';
                 if(j>0)
                    cout<<' ';
            }
            else if(i<s+1)
            {
                cout<<num[1][str[j]];
                for(k=1;k<s+1;k++)
                {
                    cout<<' ';
                }
                cout<<num[2][str[j]];
                 if(j>0)
                    cout<<' ';
            }
            else
            {
               cout<<num[4][str[j]];
               for(k=1;k<s+1;k++)
               {
                   cout<<' ';
               }
               cout<<num[5][str[j]];
                if(j>0)
                    cout<<' ';
            }
        }
        cout<<endl;
   }
   return ;
}
int main()
{
    int s,n,i;
    int str[10];
    while(~scanf("%d%d",&s,&n)&&(s||n))
    {
        i=0;
        if(n==0)
        {
            str[0]=0;
            i=1;
        }
        else
        {
            while(n)
            {
                str[i++]=n%10;
                n/=10;
            }
        }
//        for(int t=i-1;t>=0;t--)
//            cout<<str[t];
        print(s,str,i);
        cout<<endl;
    }
    return 0;
}

还有一个解法,就是开一个足够大的数组,将所有的数字存在里面,全部处理出来之后在一起逐行输出,大概是num[30][23*10] (最多八位数,s最大为十,所以最多需要8*23列,加上空列,同理最多20行,加上空行);代码有兴趣的同学可以自己试一下。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值