1031 Hello World for U (20 分)(数学题)
Given any string of N (≥5) characters, you are asked to form the characters into the shape of U. For example, helloworld can be printed as:
h d
e l
l r
lowo
That is, the characters must be printed in the original order, starting top-down from the left vertical line with n1 characters, then left to right along the bottom line with n2 characters, and finally bottom-up along the vertical line with n3 characters. And more, we would like U to be as squared as possible – that is, it must be satisfied that n1 = n3 =max { k| k≤n2 for all 3≤n2 ≤N } with n1 +n2 +n3 −2=N.
Input Specification:
Each input file contains one test case. Each case contains one string with no less than 5 and no more than 80 characters in a line. The string contains no white space.
Output Specification:
For each test case, print the input string in the shape of U as specified in the description.
Sample Input:
helloworld!
Sample Output:
h !
e d
l l
lowor
分析
本题考查数学题,n1和n2的约束条件是 n 1 < = N + 2 2 ( 1 ) n1<=\frac{N+2}{2} (1) n1<=2N+2(1),n1和n2之间的关系是n2=N+2-2n1,因为n1只有条件(1)的约束,而n2可能还要受奇偶性的约束,因为若N为偶数,则n2必须为偶数,若N为奇数,则n1必须为奇数,因此先确定n1的值,可以避免对n2的讨论。
#include <iostream>
using namespace std;
char a[85][85];
int main(){
int n,n1,n2;
string s;
cin>>s;
n=s.length();
n1=(n+2)/3;
n2=(n+2)-2*n1;
int i=0,j=0,cnt=0;
n1--;
while(i<n1){
a[i][0]=s[cnt];
cnt++;
i++;
}
while(j<n2){
a[i][j]=s[cnt];
cnt++;
j++;
}
j--,i--;
while(i>=0){
a[i][j]=s[cnt];
cnt++;
i--;
}
for(int i=0;i<n1+1;i++){
for(int j=0;j<n2;j++){
if(a[i][j]) cout<<a[i][j];
else cout<<" ";
}
cout<<endl;
}
return 0;
}