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