前言
正文
思路
由题意可知,这个U需要尽可能的正,于是给出我们限制条件,即
n1=n3=max{k|k<=n2,3<=n2<=N} ;同时n1+n2+n3-2=N。可以看出,n1
就是我们需要输出的行数,n2就是我们需要输出的列数,也就是说,
U形图形两侧的字符数n1和n3总是不超过n2,同时需要是n1和n2尽可能大,
可以参考PAT B1027打印沙漏的思路,由等式n1+n2+n3-2=N推出2*k+n2-2=N,
又因为k<=n2,因此得出k<= (N+2)/3,也就是说k最大是(N+2)/3
参考题解
#include<iostream>
#include<string>
using namespace std;
/*
由题意可知,这个U需要尽可能的正,于是给出我们限制条件,即
n1=n3=max{k|k<=n2,3<=n2<=N} ;同时n1+n2+n3-2=N。可以看出,n1
就是我们需要输出的行数,n2就是我们需要输出的列数,也就是说,
U形图形两侧的字符数n1和n3总是不超过n2,同时需要是n1和n2尽可能大,
可以参考PAT B1027打印沙漏的思路,由等式n1+n2+n3-2=N推出2*k+n2-2=N,
又因为k<=n2,因此得出k<= (N+2)/3,也就是说k最大是(N+2)/3
*/
int main(){
string str;
int N,n1,n2,n3;
cin>>str;
N=str.size();
n1=(N+2)/3,n3=n1,n2=N+2-2*n1;
//先输出n1-1行,注意字符下标是对称的,最后直接输出底部最后一行
for(int i=0;i<n1-1;i++){
cout<<str[i];
//输出n2-2个空格
for(int j=0;j<n2-2;j++)cout<<" ";
//输出对称位置的字符
cout<<str[N-1-i]<<endl;
}
//输出最后一行
for(int i=n1-1;i<N-(n1-1);i++){
cout<<str[i];
}
cout<<endl;
return 0;
}