1
题目大意:

将给定字符串按U形进行输出。其中n1为左侧竖线包含的字符数,n2为底部横线包含的字符数,n3为右侧竖线包含的字符数,且n1、n2、n3均包含拐角处相交的字符,于是有n1+n2+n3=N+2恒成立。此外,对n1、n2、n3有如下的限制性条件:

  1. n1=n3,即左侧竖线包含的字符数等于右侧竖线包含的字符数。
  2. n2≥n1,即底部横线包含的字符数总是不少于左、右单侧竖线包含的字符数。
  3. 在满足上面两个条件的前提下,使n1尽可能大。
算法思路:

首先得获取n1,n2和n3,获取的方法是从小到大遍历n2,这样对于n1和n3来说就是从大到小变化,在(N+2-n2)可以整除2的情况下,第一次满足的n1<=n2必定是最大的n1。然后再按照每一行进行输出,对于第1到n1-1行,都是左右两边一个字符,中间n2-2个空格,最后一行为n2个字符。为此使用index标记最左边的待输出字符的位置,对于第1到n1-1行,第一个字符为s[index],最右边的字符则为s[N-1-index],最后一行的输出直接输出n2个s[index++]即可。

提交结果:

360截图17860530334858.png

AC代码:
#include<cstdio>
#include<cstring>

using namespace std;

int main(){
    char s[90];
    scanf("%s",s);
    int N = strlen(s);// 字符串的长度 
    int n1,n2,n3;//2n1+n2=N+2 ,n1为小于n2的最大值 
    //遍历n2获取n1,n3
    for(n2=3;n2<=N;++n2){
        if((N+2-n2)%2==0){
            n1 = (N+2-n2)/2;
            n3 = n1;
            if(n1<=n2){
                break;
            }
        }
    } 
    int index = 0;//标记当前待输出字符的位置(从左往右) 
    //输出结果,除了最后一行,其他的每一行都是输出一个字符,n2-2个空格,一个字符 
    for(int i=0;i<n1-1;++i){
        printf("%c",s[index]);
        for(int j=0;j<n2-2;++j){
            printf(" ");
        } 
        printf("%c\n",s[N-1-index]);
        ++index;
    } 
    //输出最后一行
    for(int i=0;i<n2;++i){
        printf("%c",s[index++]);
    } 
    return 0;
}

乔梓鑫
569 声望17 粉丝

主要分享个人学习经验和心得