前言
正文
思路
由題意可知,這個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;
}