P1538迎春舞会之数字舞蹈

传送

 

输入输出样例:(洛咕的太丑了就不放了)

(1前面有三个空格)

 这真是一群闲(qian)圈(zou)的人。大号+小号提交了不下10遍终于a了

好了我们来研究一下这些数字"美观"的构造

单独截取一个数字:

(k=2)

我们发现"|"与"-"不在同一列上(hin重要),而且k是原数字的竖线和横线的总长度,是整个数字的宽度。

在样例中,"1"的前面有三个空格,显然1比较特殊,我们来研究一下1的摆放 

 

第一个1前面有4个空格,其他的1前面有5个空格。

结合样例,我们可以得出1是右对齐(也就是前面要有k+1个空格),不是第一个数字的1因为多了一个空格,所以前面是k+2个空格。

接下来我们就可以打表了(蒟蒻只会打表)

我们用cnt记录当前的字符在答案中的哪一列(第一个1前面的空格没有算在内,在最后会处理),同时会发现有很多数字有一些神奇的结构(见下图)

 

就是有三组"-",两组在同一列上的"|",所以我们可以把这种方式写成两个函数。

void work()//三组"-"
{
        for(int j=1;j<=k;j++)//规律画一画可得
             ans[1][cnt+j]='-',ans[2+k][cnt+j]='-',ans[3+2*k][cnt+j]='-';
        return ;
}
void lie()//两组"|"
{
    for(int j=0;j<=2*k;j++)
             ans[2+j][cnt]='|';
            ans[2+k][cnt]=' ';
    return ;        
}

以及蒟蒻太过蒟蒻,全是1的情况只能特判掉

细节神马的见代码吧

#include<bits/stdc++.h>
using namespace std;
int k,cnt,one;
string cc;
char ans[1009][509];
void work()
{
        for(int j=1;j<=k;j++)
             ans[1][cnt+j]='-',ans[2+k][cnt+j]='-',ans[3+2*k][cnt+j]='-';
        return ;
}
void lie()
{
    for(int j=0;j<=2*k;j++)
             ans[2+j][cnt]='|';
            ans[2+k][cnt]=' ';
    return ;        
}
int main()
{
    cin>>k;
    cin>>cc;
    cnt=1;
    for(int i=0;i<cc.length();i++)
     if(cc[i]=='1')one++;//one统计1的个数,如果全是1,就特判掉
    if(one==cc.length())
    {
      printf("\n");
      for(int e=1;e<=k;e++)    
       {
           for(int j=1;j<=cc.length();j++)
       {
            for(int i=1;i<=k+1;i++)
           printf(" ");
        printf("|");
           printf(" "); 
       }
       printf("\n");
       }
       printf("\n");
         for(int e=1;e<=k;e++)    
       {
           for(int j=1;j<=cc.length();j++)
       {
           for(int i=1;i<=k+1;i++)
         printf(" ");
        printf("|"); 
         printf(" ");
       }
       printf("\n");
       }
       return 0;
    } 
    for(int i=0;i<cc.length();i++)
    {
        if(cc[i]=='1')//把10个字符打表打出来
        { 
          if(one!=cc.length())
            cnt+=k+1;//空格十分之恶心
            lie();
            cnt+=2;
        }
        if(cc[i]=='2')
        {
            work();
            for(int j=1;j<=k;j++)
             ans[2+k+j][cnt]='|';
            cnt+=k;cnt++;
            for(int j=1;j<=k;j++)
             ans[1+j][cnt]='|';
             cnt+=2;  
        }
        if(cc[i]=='0')
        {
            for(int j=1;j<=k;j++)
             ans[1][cnt+j]='-',ans[3+2*k][cnt+j]='-';
            lie();
             cnt+=k;cnt++;
            lie();    
            cnt+=2;  
        }
        if(cc[i]=='3')
        {
            work();
            cnt+=k;cnt++;
            lie();
            cnt+=2;
        }
        if(cc[i]=='4')
        {
            for(int j=0;j<k;j++)
            ans[2+j][cnt]='|';
            for(int j=1;j<=k;j++)
            ans[2+k][cnt+j]='-';
            cnt+=k;cnt++;
            lie();
            cnt+=2;
        }
        if(cc[i]=='5')
        {
            work();
            for(int j=0;j<k;j++)
             ans[2+j][cnt]='|';
            cnt+=k;cnt++;
            for(int j=0;j<k;j++)
             ans[3+k+j][cnt]='|';
             cnt+=2;
        }
        if(cc[i]=='6')
        {
            work();
            lie();
            cnt+=k;cnt++;
            for(int j=0;j<k;j++)
             ans[3+k+j][cnt]='|';
             cnt+=2;
        }
        if(cc[i]=='7')
        {
            for(int j=1;j<=k;j++)
             ans[1][cnt+j]='-';
            cnt+=k;cnt++;
            lie(); 
            cnt+=2;
        }
        if(cc[i]=='8')
        {
            work();
            lie();
            cnt+=k;cnt++;
            lie();
            cnt+=2;
        }
        if(cc[i]=='9')
        {
            work();
            for(int j=0;j<k;j++)
             ans[2+j][cnt]='|';
            cnt+=k;cnt++;
            lie(); 
            cnt+=2;
        }
    }
    
    for(int i=1;i<=3+2*k;i++)
    {
       if(one==cc.length())//前面要处理空格
         {printf(" ");
         }
        for(int j=1;j<=cnt;j++)
         {
             if(ans[i][j]=='\0')ans[i][j]=' ';//把没有赋值的地方标记成空格
            cout<<ans[i][j];
         }
         cout<<endl;
    }
}

 

posted @ 2019-07-08 15:25  千载煜  阅读(238)  评论(0编辑  收藏  举报