【题目来源】
https://www.acwing.com/problem/content/1517/
【题目描述】
给定一个长度为 N 的字符串,请你将它以 U 形输出。
例如,helloworld 可以输出为:
h d
e l
l r
lowo
也就是说,必须按照原始顺序输出字符,左垂直线自上而下共有 n1 个字符,底部行从左到右共有 n2 个字符,右垂直线自下而上共有 n3 个字符。
另外,必须满足 n1=n3=max{k|k≤n2对于所有3≤n2≤N} 以及 n1+n2+n3−2=N。
对于 helloworld,n1=n2=n3=4。
【输入格式】
包含一个长度不少于 5 且不超过 80 的字符串,字符串内不含空格。
【输出格式】
输出转化为 U 形后的图案。
【输入样例】
helloworld!
【输出样例】
h !
e d
l l
lowor
【算法分析】
● 由已知 n1+n2+n3−2=n,n1=n3,可得 n+2=2∗n1+n2,其中 n2>=n1
● 由 3≤n2≤n,故可对 n+2 进行模 3 操作,则有:
(1)若 (n+2)%3=0,则 n2=n1,故此条件下可得 n+2=3*n1。
(2)若 (n+2)%3=1,则 n2=n1+1,故此条件下可得 n+2=3*n1+1。
(3)若 (n+2)%3=2,则 n2=n1+2,故此条件下可得 n+2=3*n1+2。
● 综上,可得:
(1)在 C++ 中 “/” 的向下取整语境下,及上文中“n+2=3*n1、n+2=3*n1+1、n+2=3*n1+2”,可得 n1=(n+2)/3
(2)在 C++ 中 “/” 的向下取整语境下,及上文中“n2=n1、n2=n1+1、n2=n1+2”,可得 n2=n1+(n+2)%3
(3)代码中各个循环边界的示意图如下所示:
【算法代码】
#include <bits/stdc++.h>
using namespace std;
const int maxn=85;
char g[maxn][maxn];
int main() {
string s;
cin>>s;
int n=s.size();
int n1=(n+2)/3;
int n2=n1+(n+2)%3;
int n3=n1;
int cnt=0;
for(int i=0; i<n1; i++) g[i][0]=s[cnt++];
for(int i=1; i<n2; i++) g[n1-1][i]=s[cnt++];
for(int i=n1-2; i>=0; i--) g[i][n2-1]=s[cnt++];
for(int i=0; i<n1; i++) {
for(int j=0; j<n2; j++) {
if(g[i][j]) cout<<g[i][j];
else cout<<" ";
}
cout<<endl;
}
return 0;
}
/*
in:
helloworld!
out:
h !
e d
l l
lowor
*/
【参考文献】
https://www.acwing.com/solution/content/13778/
https://www.acwing.com/problem/content/solution/1517/1/