1031 Hello World for U
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
题意
给定一个长度为 N 的字符串,请你将它以 U 形输出。
也就是说,必须按照原始顺序输出字符,左垂直线自上而下共有 n1 个字符,底部行从左到右共有 n2 个字符,右垂直线自下而上共有 n3 个字符。
另外,必须满足 n1=n3=max{k|k≤n2对于所有3≤n2≤N} 以及 n1+n2+n3−2=N 。
思路
由题可知:
n1+n2+n3-2=N
n1=n3
n1<=n2
所以可得:
n2=N-2*n1+2
再带入到 n1<=n2 可得:
n1<=N+2*n1+2 即 n1<=(N+2)/3
故 n1=n3=(N+2)/3 且 n2=n1+(N+2)%3
然后按照 U 字形顺序将字符串填入数组,最后输出数组即可。
代码
#include<bits/stdc++.h> using namespace std; const int N = 100; char g[N][N]; int main() { string str; cin >> str; //计算n1,n2,n3 int n1 = (str.size() + 2) / 3; int n2 = n1 + (str.size() + 2) % 3; //将字符串按照U字形填入数组 int k = 0; for (int i = 1; i <= n1; i++) g[i][1] = str[k++]; for (int i = 2; i <= n2; i++) g[n1][i] = str[k++]; for (int i = n1 - 1; i >= 1; i--) g[i][n2] = str[k++]; //输出填充后 for (int i = 1; i <= n1; i++) { for (int j = 1; j <= n2; j++) if (g[i][j]) cout << g[i][j]; else cout << " "; cout << endl; } return 0; }