2018 多校联合第三场 L. Visual Cube(HDU 6330)

吐槽一波,为啥比赛的时候思路就不清晰呢,看了几个小时还是各种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;
}

猜你喜欢

转载自blog.csdn.net/love_phoebe/article/details/81298101