141. 输出字母沙漏
题目描述 输入一个正整数 n,并输出一个沙漏形,这个沙漏形有 2n+1 行,第一行有 2n+1 个字母,其中前 n+1 个字符是从 A 开始依次递增的,而后 n 个字符是由第 n+1 个字符开始依次递减的。之后的 n 行每行会少头尾两个字母。再之后的 n 行则正好是前 n 行反过来输出的结果。注意末尾不要有多余的输出。
输入 输入一个正整数 n。(0<n<26) 输出 按照样例输出。
样例输入 2 样例输出 ABCBA BCB C BCB ABCBA 样例输入2 3 样例输出2 ABCDCBA BCDCB CDC D CDC BCDCB ABCDCBA 数据规模与约定 时间限制:1 s
内存限制:256 M
100% 的数据保证 0<n<26 入门组循环字符
这道OJ题还是花了很长时间来完成的,那么为了后续在回忆时有个依照,也为看到这道题同样没有思路的朋友,提供个思路。
思路如下:
1.判断输出的行数 for(int i=0;i<(2*n+1);i++);
2.输出字母前如何空格: //对是否要输出空格做判定 e=i<(n+1)?i:--e; k=e; while(k){ printf(" "); k--; }
3.沙漏上半部分
if(i<=n){
//沙漏上半部分
//对每行输出多少字母做判定
for(int j=0;j<2*abs(n-i)+1;j++){
//对每行输出递增字母做判断
printf("%c",c+'A');
if(j<abs(n-i)){
++c;
}else{
--c;
}
}
printf("\n");
if(i != n)
c+=2;
}
4.沙漏下半部分
//对每行输出多少字母做判定
for(int j=0;j<2*abs(n-i)+1;j++){
//对每行输出递增字母做判断
printf("%c",c+'A');
if(j<abs(n-i)){
++c;
}else{
--c;
}
}
printf("\n");
完整代码:
#include int abs(int n){ if(n<0) return -n; }
int main(){ int n=0,c=0,e=0,k=0; scanf("%d",&n); for(int i=0;i<(2*n+1);i++){//输出的行数
//对是否要输出空格做判定
e=i<(n+1)?i:--e;
k=e;
while(k){
printf(" ");
k--;
}
if(i<=n){//沙漏上半部分
//对每行输出多少字母做判定
for(int j=0;j<2*abs(n-i)+1;j++){
//对每行输出递增字母做判断
printf("%c",c+'A');
if(j<abs(n-i)){
++c;
}else{
--c;
}
}
printf("\n");
if(i != n)
c+=2;
}else{//沙漏下半部分
//对每行输出多少字母做判定
for(int j=0;j<2*abs(n-i)+1;j++){
//对每行输出递增字母做判断
printf("%c",c+'A');
if(j<abs(n-i)){
++c;
}else{
--c;
}
}
printf("\n");
}
} return 0; }