Problem L. Visual Cube
Problem Description
Little Q likes solving math problems very much. Unluckily, however, he does not have good spatial ability. Everytime he meets a 3D geometry problem, he will struggle to draw a picture.
Now he meets a 3D geometry problem again. This time, he doesn’t want to struggle any more. As a result, he turns to you for help.
Given a cube with length
a
a
, width and height
c
c
, please write a program to display the cube.
Input
The first line of the input contains an integer , denoting the number of test cases. In each test case, there are 3 3 integers , denoting the size of the cube.
Output
For each test case, print several lines to display the cube. See the sample output for details.
Sample Input
2
1 1 1
6 2 4
Sample Output
..+-+
././|
+-+.+
|.|/.
+-+..
....+-+-+-+-+-+-+
.../././././././|
..+-+-+-+-+-+-+.+
./././././././|/|
+-+-+-+-+-+-+.+.+
|.|.|.|.|.|.|/|/|
+-+-+-+-+-+-+.+.+
|.|.|.|.|.|.|/|/|
+-+-+-+-+-+-+.+.+
|.|.|.|.|.|.|/|/.
+-+-+-+-+-+-+.+..
|.|.|.|.|.|.|/...
+-+-+-+-+-+-+....
题目概述
给你一个立方体的长宽高,要你画出一幅图显示该立方体
根据给出的测试样例找到画图方法
输入第一行为一个整数T,代表有T组测试样例
第二行有三个整数a,b,c 分别代表该立方体的长,宽,高
思路
根据样例输出我们可以发现他打出来的是一个立方体,我们将多余的“.”去掉可以发现
立方体的长是6,宽是2,高是4.所以
上底面的长是由6个“-”用“+”分隔开(或者6个“.”用“/”分隔开)。宽是由2个“/”,用“+”隔开
正面的长是由6个“-”用“+”分隔开(或者6个“.”用“|”分隔开)。宽是由4个“|”,用“+”隔开
侧面的长是由2个“/”用“+”分隔开(或者2个“.”用“/”分隔开)。宽是由4个“|”,用“+”隔开
从体重可以看出打出来的图是一个矩形那么我们只需要将未填充的部分打上“.”即可
除此之外,我们还可以发现当输入的长宽高是递减时 会有不同
代码
#include <iostream>
#include <cstdio>
using namespace std;
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
int a,b,c,i,j,h;
scanf("%d %d %d",&a,&b,&c);
h=(c+b)*2+1;
for(j=0;j<h;j++)
{
for(i=0;i<b*2-j;i++)//上底面部分填充"."
printf(".");
if(j%2==0) //偶数行
{
printf("+");
for(i=0;i<a;i++)
printf("-+");
if(j>2*c&&j<2*b) //上底面与侧面交叉部分填充方法
for(i=0;i<c&&i<b;i++)
printf(".+");
else
for(i=0;i<j/2&&i<((h-1-j)/2)&&i<b;i++)
printf(".+"); //
}
else //奇数行
{
if(j<b*2) //填充上底面
{
printf("/");
for(i=0;i<a;i++)
printf("./");
printf("|");
if(j>2*c&&j<2*b) //上底面与侧面交叉部分填充方法
{
for(i=0;i<(j/2-(j-2*c)/2)-1;i++)
printf("/|");
printf("/");
}
else
for(i=0;i<j/2;i++)
printf("/|"); //上底面与侧面交叉部分填充结束
} //填充上底面结束
else //填充正面
{
printf("|");
for(i=0;i<a;i++)
printf(".|");
if(j<2*c) //正面与侧面交叉部分填充方法
for(i=0;i<b;i++)
printf("/|");
else
{
for(i=0;i<((h-1-j)/2);i++)
printf("/|");
printf("/");
} //正面与侧面交叉部分填充结束
} 填充正面结束
}
for(i=0;i<j-c*2;i++)//侧面部分填充"."
printf(".");
printf("\n");
}
}
}
这道题描述起来很抽象,希望各位大佬能够多看看,好好体味一下。也可以按照自己的思路改写一下代码,通过与调试发现问题,加深理解吧。
留下你们的小心心吧@\/@