任意の文字列を考えるとN(≥5)文字、あなたがの形に文字を形成するように求められますU
。例えば、helloworld
として印刷することができます。
h d
e l
l r
lowo
すなわち、文字が持つ左側の縦線からトップダウン開始、元の順序で印刷されなければならないれているNとボトムラインに沿って左から右へ、次いで、1つの文字を、N 2つの文字、及び垂直線に沿って最終的にボトムアップnは 3つの文字。より、我々は希望U
できるだけ二乗のように-つまり、その満たされなければならないN 1 = N 3 = M X { K | K ≤ N全て3≤2 N 2≤ N有する} N 1 + N 2 + N 3-2 = N。
入力仕様:
各入力ファイルには、1つのテストケースが含まれています。各ケースは5未満とラインで超えない80の文字なしで1つの文字列が含まれています。文字列には空白が含まれていません。
出力仕様:
各テストケースのために、説明に指定されているU形状の入力文字列を印刷します。
サンプル入力:
helloworld!
サンプル出力:
h !
e d
l l
lowor
考え
- 長さのための側部及び底部を有する正方形のような可能な限りの画像を作るために\(\ GE \)によって両側辺の長さ、\(N_1 + N_2 + n_3-2 = N \) 見\(N_1、n_3 \)小さくなるように、リミットケースがされ(N_2 N_1 = = n_3 \)\確保するためにどのようにして、\(N_1 = n_3 \ルN_2 \を) それは、聞かせて\(N_1 = n_3 =(N + 2)/ 2 \)それは切り捨てされているので、関係なので、そこにする必要があります(ルN_2 N_1 = n_3 \ \ \) 設立
コード
#include<bits/stdc++.h>
using namespace std;
int main()
{
string s;
cin >> s;
int n = s.size();
int vertical, bottom;
vertical = (n + 2) / 3;
bottom = n - 2*vertical + 2;
int l = 0, r = n - 1;
for(int i=0;i<vertical-1;i++)
{
cout << s[l];
for(int j=0;j<bottom-2;j++) cout << " ";
cout << s[r];
cout << endl;
l++; r--;
}
for(int i=l;i<=r;i++)
cout << s[i];
return 0;
}
引用文
https://pintia.cn/problem-sets/994805342720868352/problems/994805462535356416