题目:
给定N的任何字符串(≥5) 字符,你被要求把字符组成U的形状。例如,helloworld
可以打印为:
h d
e l
l r
lowo
字符必须按原来的顺序打印,从左垂直线开始从上到下打印n1个字符,然后从左到右打印n2个字符,最后从下到上打印n3个字符。更重要的是,我们希望U
是尽可能的方正,也就是说,必须满足n1=n3=max{k | k≤n2,3≤n2≤N},有n1+n2+n3−2=N。
输入格式:
每个输入文件包含一个测试用例。每一个大小写包含一个字符串,每行不少于5个字符,不超过80个字符。字符串不包含空格。
输出格式:
对于每个测试用例,按描述中指定的U形打印输入字符串。
输入样例:
helloworld!
输出样例:
h !
e d
l l
lowor
思想:
先计算n1、n2、n3的值,n1+n2+n3-2=N,即n2=N+2-2n1,n1≤N+2-2n1,n1≤(N+2)/3。ni为整数,故n1的最大值为(N+2)/3向下取整,再求得n2的值。
AC代码:
(解法1:直接打印)
#include<iostream>
#include<string.h>
#include<math.h>
using namespace std;
int main(){
string str;
cin>>str;
int N=str.size();
int n1=floor((N+2)*1.0/3);
int n2=N+2-2*n1;
for(int i=0;i<n1;i++){
for(int j=0;j<n2;j++){
if(i<n1-1){
if(j==0) printf("%c",str[i]);
else if(j==n2-1) printf("%c",str[N-i-1]);
else printf(" ");
}
else{
printf("%c",str[n1-1+j]);
}
}
printf("\n");
}
return 0;
}
(解法2:二维数组)
#include<iostream>
#include<string.h>
#include<math.h>
using namespace std;
int main(){
string str;
cin>>str;
char p[40][40];
for(int i=0;i<40;i++){//二维数组初始化
for(int j=0;j<40;j++){
p[i][j]=' ';
}
}
int N=str.size();
int n1=floor((N+2)*1.0/3);
int n2=N+2-2*n1;
int t=0;
for(int i=0;i<n1;i++){//左侧
p[i][0]=str[t++];
}
for(int i=1;i<n2;i++){//底部
p[n1-1][i]=str[t++];
}
for(int i=n1-2;i>=0;i--){//右侧
p[i][n2-1]=str[t++];
}
for(int i=0;i<n1;i++){//打印
for(int j=0;j<n2;j++){
printf("%c",p[i][j]);
}
printf("\n");
}
return 0;
}