吐槽一波,为啥比赛的时候思路就不清晰呢,看了几个小时还是各种bug层出不穷,哎.........
题面:
思路:
将图分部分输出,如数据2 3 2
可以观察到每一排开始的点数是从2*y递减,后面的尾部是从1到2*y;
没一排的字符数和总输出行数: length=3+(x-1)*2+y*2,high=2*y+2*z+1;
对于前2*y排前面需输出预制相关的点;
如数据 2 3 2:
然后输出每一排的除侧面的字符;
所有的奇数排都按x的值输出 +-+
前2*y的偶数排因为位于上表面需输出 /./ 其余的输出 |.|
得到:
最后输出侧面:
前面计算出了每一行的字符总数length
每一行减去前两步输出的就是侧面要输出的字符数;
对于最后2*y行还要减去小数点的数目
得到的长度就是每一行要输出的侧面字符数;
对于奇数行都是输出 .+;
对于偶数行的前 2*y 行 按| / | / | 的顺序输出 ,其余行按 / | / | 的顺序输出;
给出代码:
#include<cstdio>
#include<vector>
using namespace std;
int main(){
int T;
scanf("%d",&T) ;
while(T--){
int x,y,z;
scanf("%d%d%d",&x,&y,&z);
int length=3+(x-1)*2+y*2,high=2*y+2*z+1;
int l1=2*y,l2;
for(int i=1;i<=high;i++){
int sum=0;
if(i<=l1){
for(int j=0;j<l1-i+1;j++)printf("."),sum++;
}
if(i%2!=0){
printf("+-+");sum+=3;
for(int j=0;j<x-1;j++)printf("-+"),sum+=2;
}else{
if(i<=l1){
printf("/./");sum+=3;
for(int j=0;j<x-1;j++)printf("./"),sum+=2;
}else{
printf("|.|");sum+=3;
for(int j=0;j<x-1;j++)printf(".|"),sum+=2;
}
}
//printf("% d",sum);
l2=length-sum;
if(i>high-l1)l2-=(l1-high+i);
for(int j=1;j<=l2;j++){
if(i%2!=0){
if(j%2!=0)printf(".");
else printf("+");
}else{
if(i<=l1){
if(j%2!=0)printf("|");
else printf("/");
}else{
if(j%2!=0)printf("/");
else printf("|");
}
}
}
if(i>high-l1){
for(int j=1;j<=l1-high+i;j++)printf(".");
}
//printf(" %d",l2);
printf("\n");
}
}
return 0;
}