模拟 UVa 706 LC-Display

来源:互联网 发布:php行业发展前景 编辑:程序博客网 时间:2024/04/26 21:28

 

题目链接:

  http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=647

题目意思:

    将一个整数用给定的‘-’,‘|’的规则给表示出来。

     规则:用s个“-”表示水平线段,s个“|”表示竖直线段。每一个阿拉伯数字占用s+2列和2s+3行。注意那些数字中的空白之处要填上空格,并且两个数字之间必须有一个空列。在每一个整数后面输出一个空行。

解题思路:

   大体上分成两部分,水平部分和竖直部分。

代码:

#include<iostream>#include<cmath>#include<cstdio>#include<cstdlib>#include<string>#include<cstring>#include<algorithm>#include<vector>#include<map>#define eps 1e-6#define INF (1<<20)#define PI acos(-1.0)using namespace std;char ans[30][150],temp[20];int s;void solve(int i,int len){    int start=(i-1)*(s+3)+1; //注意这个数开始的位置    switch(temp[i-1])    {        case '1':for(int j=1;j<=s;j++)                    ans[j+1][start+s+1]=ans[j+1+s+1][start+s+1]='|';                 break;        case '2':for(int j=1;j<=s;j++)                    ans[1][j+start]=ans[s+2][j+start]=ans[2*s+3][j+start]='-';                 for(int j=1;j<=s;j++)                    ans[j+1][start+s+1]=ans[j+1+s+1][start]='|';                 break;        case '3':for(int j=1;j<=s;j++)                    ans[1][j+start]=ans[s+2][j+start]=ans[2*s+3][j+start]='-';                 for(int j=1;j<=s;j++)                    ans[j+1][start+s+1]=ans[j+1+s+1][start+s+1]='|';                 break;        case '4':for(int j=1;j<=s;j++)                    ans[2+s][start+j]='-';                 for(int j=1;j<=s;j++)                    ans[j+1][start]=ans[j+1][start+s+1]=ans[j+s+2][start+s+1]='|';                break;        case '5':for(int j=1;j<=s;j++)                    ans[1][j+start]=ans[s+2][j+start]=ans[2*s+3][j+start]='-';                 for(int j=1;j<=s;j++)                    ans[j+1][start]=ans[j+1+s+1][start+s+1]='|';                 break;        case '6':for(int j=1;j<=s;j++)                    ans[1][j+start]=ans[s+2][j+start]=ans[2*s+3][j+start]='-';                 for(int j=1;j<=s;j++)                    ans[j+1][start]=ans[j+s+2][start]=ans[j+s+2][start+s+1]='|';                 break;        case '7':for(int j=1;j<=s;j++)                    ans[1][j+start]='-';                 for(int j=1;j<=s;j++)                    ans[j+1][start+s+1]=ans[j+1+s+1][start+s+1]='|';                 break;        case '8':for(int j=1;j<=s;j++)                    ans[1][j+start]=ans[s+2][j+start]=ans[2*s+3][j+start]='-';                 for(int j=1;j<=s;j++)                    ans[j+1][start]=ans[j+1][start+s+1]=ans[j+s+2][start]=ans[j+s+2][start+s+1]='|';                 break;        case '9':for(int j=1;j<=s;j++)                    ans[1][j+start]=ans[s+2][j+start]=ans[2*s+3][j+start]='-';                for(int j=1;j<=s;j++)                    ans[j+1][start]=ans[j+1][start+s+1]=ans[j+s+2][start+s+1]='|';                break;        case '0':for(int j=1;j<=s;j++)                    ans[1][j+start]=ans[2*s+3][j+start]='-';                for(int j=1;j<=s;j++)                    ans[j+1][start]=ans[j+1][start+s+1]=ans[j+s+2][start]=ans[j+s+2][start+s+1]='|';                    break;    }    return ;}void init(int len){    int sumcol=(s+3)*len;    for(int i=1;i<=(2*s+3);i++)        for(int j=0;j<sumcol;j++)            ans[i][j]=' ';    //初始化为全部为空    for(int i=1;i<=(2*s+3);i++)        ans[i][sumcol]='\0';  //最后一列为‘\0'作为输出字符串的结束    return ;}int main(){    while(scanf("%d %s",&s,temp)!=EOF)    {        if(s==0&&*temp=='0')            break;        int len=strlen(temp);        init(len); //初始化        for(int i=1;i<=len;i++)            solve(i,len); //对每一个数字进行处理        for(int i=1;i<=2*s+3;i++)            printf("%s\n",ans[i]+1); //一行一行的输出,每行从1开始        putchar('\n');    }    return 0;}


 

 

原创粉丝点击