分析:
1、首先题目中说 “竖线随着总高度每增长6而增加1个字符宽”,即竖着的笔画的宽度随着给出的高度每增加 6 而增加一,也就是 shunxian =(height/6)+1;
2、下圈高度不小于上圈的高度,并且应尽量接近上圈的高度,也就是 shangquan =(height-3)/2 , 减 3 是因为最后一行,第一行以及中间一行横着写的行先去掉,如果(height-3)%2 为 0,则说明上下圆一样大;如果不是为 0 ,说明不能平分,那下圆的高度就是 xiaquan=(height-3)/2+1。
3、下圈的内径呈正方形.说明下圈的高度只要知道了,那么最后一行,第一行以及中间一行应填充的字符的个数就能确定了,即横线的宽度 hengxian=xiaquan 。
#include <iostream>
#include <algorithm>
#include <map>
#include <string> #没有这行会报错
using namespace std;
int main() {
int i,j;
int n;
char a;
int num;
cin >> n;
while (n--){
cin >> a;
cin >> num;
int xiaquan;
int shuxian = num/6+1; //竖线宽度
int shangquan=(num-3)/2; //上圈高度
if((num-3)%2==0){
xiaquan=(num-3)/2; //下圈高度
}else{
xiaquan=(num-3)/2+1; //下圈高度
}
int hengxian = xiaquan ; //横线宽度
//开始打印
for(int i=1; i<=num; i++){
if(i==1){ //打印第一行
for(int j=1;j<=shuxian;j++){
cout << " ";
}
for(int j=1;j<=xiaquan;j++){
cout << a;
}
cout << endl;
continue;
}
if(i==shangquan+2){ //打印中间行
for(int j=1;j<=shuxian;j++){
cout << " ";
}
for(int j=1;j<=xiaquan;j++){
cout << a;
}
cout << endl;
continue;
}
if(i==num){ //打印最下面的行
for(int j=1;j<=shuxian;j++){
cout << " ";
}
for(int j=1;j<=xiaquan;j++){
cout << a;
}
cout << endl;
continue;
}
for(int j=1;j<=hengxian+shuxian*2;j++){ //打印其他行
if(j<=shuxian){
cout << a;
} else{
if(j<=hengxian+shuxian){
cout << " ";
} else{
cout << a;
}
}
}
cout << endl;
}
if(n){
cout << endl;
}
}
return 0;
}