题目大意:
将给定字符串按U形进行输出。其中n1为左侧竖线包含的字符数,n2为底部横线包含的字符数,n3为右侧竖线包含的字符数,且n1、n2、n3均包含拐角处相交的字符,于是有n1+n2+n3=N+2恒成立。此外,对n1、n2、n3有如下的限制性条件:
- n1=n3,即左侧竖线包含的字符数等于右侧竖线包含的字符数。
- n2≥n1,即底部横线包含的字符数总是不少于左、右单侧竖线包含的字符数。
- 在满足上面两个条件的前提下,使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;
}
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。