Posted on 2010-08-23 16:25
Kevin_Zhang 阅读(220)
评论(0) 编辑 收藏 引用 所属分类:
模拟
http://acm.pku.edu.cn/JudgeOnline/problem?id=1102
本题目重点在于输出的控制上,因为不能从下往上输出,因此输出时是从左往右,自上而下的输出。数字N看成字符串来处理。一共十个字符,如何控制。LCD输出,又叫七段数码管,由此可以得到启发,10个字符,每个字符7段,则建一个7X10的二维矩阵存储笔画信息,也就是一个二维数组。要基于7段数码管的思想输出。二维矩阵的信息比较容易得到。
#include<stdio.h>
#include<string.h>
void main()
{
void dup(char c,int n);
char line[7][11]={"- -- -----","| ||| ||","||||| |||"," ----- --","| | | | ","|| |||||||","- -- -- --"};//总共7笔,每一笔对每一个数字显示不同
char str[9];//利用字符串处理测试数据将的又是在只要屏幕能容下,不管数据大小
int s,i,j,k,t;
while(scanf("%d%s",&s,str)&&s!=0)//输入测试数据直到输入0 0 为止,实际上只要判断输入的s为0即可。
{
for(j=0;j<7;j++)//按笔画输出为循环条件,一共输出7笔,笔画从0到6
{
if(j%3==0)//输出第 0 3 6笔的时候按如下格式
{
for(k=0;k<strlen(str);k++)
{
printf(" ");
t=(int)(str[k]-48);//字符转换成对应的数字
dup(line[j][t],s);//重复输出s个该笔画
printf(" ");
}
printf("\n");//每次输出一笔后换行
}
else //输出第1 2 4 5 笔的时候按如下格式
{
for(i=1;i<=s;i++)//重复输出s个该笔画,但是要换行
{
for(k=0;k<strlen(str);k++)//第1 2 和第4 5 笔是连在一行输出的
{
t=(int)(str[k]-48);
printf("%c",line[j][t]);
dup(' ',s);
printf("%c",line[j+1][t]);
printf(" ");
}
printf("\n");//每次输出一笔后换行,对1 2 4 5 而言是输出2笔就换行
}
j=j+1;
}
}
printf("\n");//两个测试数据的输出结果换行,第一次提交错误就是犯在这儿
}
}
void dup(char c,int n)//重复输出字符函数,用于重复输出s个字符
{
int i;
for(i=1;i<=n;i++)
printf("%c",c);
}
=======================