[蓝桥杯]打印大X

思路:通过笔宽和X的高度可以得到,X的宽度 = X的高度 + 笔宽 - 1(原理:如果是1笔宽,他的X的宽度等于X的高度,然后每增加2笔宽,X的宽度就会增加2),然后我们的输出顺序就是左句号,笔宽,中句号,笔宽,右句号,所以计算出 高度中心 的句号的左句号的数量最大值 t,然后遍历0 ~ t 和 t - 1 ~ 0使用函数进行打印,函数内部先判断 宽度中心 的句号数量mid = X宽度 - 2 * 笔宽 - 2 * t,且当mid为负数的时候,就不输出中心句号, 反而是减少其中一个笔宽输出。

代码如下:

#include<iostream>

using namespace std;

int w, h, maxw, t;

void printx(int p)
{
    int mid = maxw - 2 * w - 2 * p;    //判断输出的横向中心部分句号数量,为负数则减少左部分笔宽
    for(int i = 0 ; i < p ; i ++ ) printf(".");     //输出左部分句号
    if(mid < 0)    //横向中心部分句号为负数则减少左部分笔宽
        for(int i = 0 ; i < w + mid ; i ++ ) printf("*");    //只需要输出w + mid个*
    else    //否则就正常输出左笔宽,再输出横向中心部分句号
    {
        for(int i = 0 ; i < w ; i ++ ) printf("*");
        for(int i = 0 ; i < mid ; i ++ ) printf(".");
    }
    for(int i = 0 ; i < w ; i ++ ) printf("*");    //输出右部分笔宽
    for(int i = 0 ; i < p ; i ++ ) printf(".");    //输出右部分句号
    printf("\n");
}
int main()
{
    cin >> w >> h;
    maxw = h + w - 1;    //X的宽度
    t = (maxw - w) / 2;    //纵向中心的左右部分的句号数量
    for(int i = 0 ; i <= t ; i ++ ) printx(i);    //纵向上半部分以及中心的输出
    for(int i = t - 1 ; i >= 0 ; i -- ) printx(i);    //纵向下半部分的输出
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值