被gank的openjudge2745

来源:互联网 发布:大数金科网络 编辑:程序博客网 时间:2024/06/05 11:57

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 123453 678900 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行,加上空行);代码有兴趣的同学可以自己试一下。

0 0