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; } }