题目描述
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:
That is, the characters must be printed in the original order, starting top-down from the left vertical line with
n
1
n_1
n1 characters, then left to right along the bottom line with
n
2
n_2
n2characters, and finally bottom-up along the vertical line with
n
3
n_3
n3 characters. And more, we would like U to be as squared as possible – that is, it must be satisfied that
n
1
=
n
3
=
m
a
x
(
k
∣
k
<
=
n
2
f
o
r
3
<
=
n
2
<
=
N
)
n_1 = n_3 = max(k|k<=n_2 for 3 <= n_2<=N)
n1=n3=max(k∣k<=n2for3<=n2<=N) with
n
1
+
n
2
+
n
3
−
2
=
N
n_1+n_2+n_3 -2=N
n1+n2+n3−2=N。
输入
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.
输出
For each test case, print the input string in the shape of U as specified in the description.
思路
其实就是找到n2 n1即可,n2从3遍历到N,其中n1 = (N-2-n2)/2,若不为0且n1<n2即可,直到遍历到n2最大。
代码
#include<iostream>
#include<cstdio>
#include<string.h>
using namespace std;
char str[100] = { 0 };
int main()
{
cin.getline(str, 100);
int N = strlen(str);
int n1, n2=3;
for (n2 = 3; n2 <= N; n2++)
{
if ((N + 2 - n2) % 2 == 0)
{
n1 = (N + 2 - n2) / 2;
if (n1 <= n2)
{
break;
}
}
}
int l = 0;
int r = N - 1;
for (int i = 0; i < n1; i++)
{
if (i != n1 - 1)
{
printf("%c", str[l]);
l++;
for (int k = 0; k < n2 - 2; k++)
{
printf(" ");
}
printf("%c", str[r]);
r--;
printf("\n");
}
else
{
for (int k = l; k <= r; k++)
{
printf("%c", str[k]);
}
}
}
cout << endl;
}