题目粗心:

将给定字符串按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++]即可。

提交后果:

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;}