• 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("
    ");
          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("
    ");
           }
           printf("
    ");
             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("
    ");
           }
           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]=='')ans[i][j]=' ';//把没有赋值的地方标记成空格
                cout<<ans[i][j];
             }
             cout<<endl;
        }
    }
  • 相关阅读:
    iframe
    go web
    go 算法与数据结构
    go redis
    go 网络编程
    go 并发编程
    go 序列化
    go 文件操作
    go 面向对象
    go 环境及4开发
  • 原文地址:https://www.cnblogs.com/lcez56jsy/p/11151469.html
Copyright © 2020-2023  润新知