Problem L. Visual Cube

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 b and height c c , please write a program to display the cube.

Input

The first line of the input contains an integer T(1T50), denoting the number of test cases. In each test case, there are 3 3 integers a,b,c(1a,b,c20), 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");
        }
    }
}

这道题描述起来很抽象,希望各位大佬能够多看看,好好体味一下。也可以按照自己的思路改写一下代码,通过与调试发现问题,加深理解吧。

留下你们的小心心吧@\/@

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值