思路:通过笔宽和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;
}