题解 | #Hello World for U#
Hello World for U
https://www.nowcoder.com/practice/c6e414fddd7c401887c350c9cc41f01b
#include <iostream>
using namespace std;
int main() {
string a;
while (cin >> a ) {
int n=a.length();
char x[n+3][n+3];
for(int i=1;i<=n+2;i++)
{
for(int j=1;j<=n+2;j++)
{
x[i][j]=' ';
}
}
/*
U的规律:n1 = n3 = max { k| k <= n2 for all 3 <= n2 <= N } with n1 + n2 + n3 - 2 = N.
左右竖排字符个数永远小于等于横排的
横排最少和竖排个数相等,最多比竖排多两个
*/
int m;//行数
int p;//列数
//横排和竖排个数相等
if((n+2)%3==0)
{
m=(n+2)/3;
p=m;
for(int i=1;i<=m;i++)
{
x[i][1]=a[i-1];
x[i][p]=a[n-i];
}
for(int i=1;i<=p-2;i++)
{
x[m][1+i]=a[m-1+i];
}
for(int i=1;i<=m;i++)
{
for(int j=1;j<=p;j++)
{
cout<<x[i][j];
}
cout<<endl;
}
}
else if((n+1)%3==0)
{
//横排比竖排多一个
m=(n+1)/3;
p=m+1;
for(int i=1;i<=m;i++)
{
x[i][1]=a[i-1];
x[i][p]=a[n-i];
}
for(int i=1;i<=p-2;i++)
{
x[m][1+i]=a[m-1+i];
}
for(int i=1;i<=m;i++)
{
for(int j=1;j<=p;j++)
{
cout<<x[i][j];
}
cout<<endl;
}
}
else
{
//横排比竖排多两个
m=n/3;
p=m+2;
for(int i=1;i<=m;i++)
{
x[i][1]=a[i-1];
x[i][p]=a[n-i];
}
for(int i=1;i<=p-2;i++)
{
x[m][1+i]=a[m-1+i];
}
for(int i=1;i<=m;i++)
{
for(int j=1;j<=p;j++)
{
cout<<x[i][j];
}
cout<<endl;
}
}
// //用字符串长度奇偶数来区别要分6类,方法很不好,没找到本质规律,注意题目n1n2n3限制条件
// if(n%2==0)
// {
// if((n+2)%3==0)
// {
// m=(n+2)/3;//是行数也是列数
// for(int i=1;i<=m;i++)
// {
// x[i][1]=a[i-1];
// x[i][m]=a[n-i];
// }
// for(int i=1;i<=m-2;i++)
// {
// x[m][1+i]=a[m-1+i];
// }
// for(int i=1;i<=m;i++)
// {
// for(int j=1;j<=m;j++)
// {
// cout<<x[i][j];
// }
// cout<<endl;
// }
// }
// else
// {
// m=n/3;//行数
// int c=m+2;//列数
// for(int i=1;i<=m;i++)
// {
// x[i][1]=a[i-1];
// x[i][c]=a[n-i];
// }
// for(int i=1;i<=c-2;i++)
// {
// x[m][i+1]=a[m-1+i];
// }
// for(int i=1;i<=m;i++)
// {
// for(int j=1;j<=c;j++)
// {
// cout<<x[i][j];
// }
// cout<<endl;
// }
// }
// }
// else
// {
// if((n+1)%3==0)
// {
// m=(n+1)/3;//是行数
// int p=m+1;//是列数
// for(int i=1;i<=m;i++)
// {
// x[i][1]=a[i-1];
// x[i][p]=a[n-i];
// }
// for(int i=1;i<=p-2;i++)
// {
// x[m][1+i]=a[m-1+i];
// }
// for(int i=1;i<=m;i++)
// {
// for(int j=1;j<=p;j++)
// {
// cout<<x[i][j];
// }
// cout<<endl;
// }
// }
// else
// {
// m=(n+2)/3;
// for(int i=1;i<=m;i++)
// {
// x[i][1]=a[i-1];
// x[i][m]=a[n-i];
// }
// for(int i=1;i<=m-2;i++)
// {
// x[m][1+i]=a[m-1+i];
// }
// for(int i=1;i<=m;i++)
// {
// for(int j=1;j<=m;j++)
// {
// cout<<x[i][j];
// }
// cout<<endl;
// }
// }
// }
}
}
// 64 位输出请用 printf("%lld")

