Bootstrap

AcWing 1515:U 形 Hello World

【题目来源】
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/

;