X
题目描述
输出一个" X "型字符图形,给定字符为c,格式要求
图形的中心是字符'X'
四个斜轴上依次是字符'A'到给定c
行尾无空格。
具体见样例。
输入
每行一个字符c,字符只含大写字母。
输出
按顺序输出每个样例的对应结果。
样例输入
A
C
样例输出
A A
X
A A
C C
B B
A A
X
A A
B B
C C
提示
注意输入中回车也是字符!
#include<stdio.h>
#include<iostream>
using namespace std;//遇见这种打印对称图像,常规题目的思路都是先打印一部分,而后在打印另一部分
int main(){
char n;
int i,j,k;
int row=0;
int cnt;
while(scanf(" %c",&n)!=EOF){//注意%c前面要加空格,因为题目没有明确说输入到什么值或者多少个输入结束,因此用!=EOF,表示只要没有读到文件的末尾就继续读下去,但是每个测试集中间都会有回车或者空格,会占据一个字符的空间,因此要加空格进行输入
row=n-'A'+1;//先求行数
// cout<<row;
cnt=0;//标记打印每一行第一个数字之前的空格数
cout<<n;//打印上半部分
for(i=1;i<2*row;i++){
cout<<" ";
}
cout<<n;
cout<<"\n";
for(i=row-1;i>=1;i--){
cnt++;
for(j=0;j<cnt;j++){
cout<<" ";
}
printf("%c",n-cnt);
for(j=0;j<2*i-1;j++){
cout<<" ";
}
printf("%c",n-cnt);//此处最好用printf进行输出,用cout会输出对应字符的ASCII码来
cout<<"\n";
}
cnt++;
for(i=0;i<cnt;i++){//用cnt来计数
cout<<" ";
}
cout<<"X"; //打印中间部分
cout<<"\n";
for(i=1;i<=row;i++){//打印下半部分
cnt--;
for(j=0;j<cnt;j++){
cout<<" ";
}
printf("%c",n-cnt);
for(j=0;j<2*i-1;j++){
cout<<" ";
}
printf("%c",n-cnt);
cout<<"\n";
}
}
return 0;
}
思路:挺常规的打印类型题目,先输出上半部分,在输出中间,在输出下半部分即可,注意要使用while(scanf()!=EOF) 并且这个输入字符前要有一个缓冲空格,然后先求出各部分要输出的行数,用cnt记录每一行前面空格的打印数量,中间空格打印数量根据row可以算出,具体的算法就是根据等差数列,上半部分的第一行cnt=0,每往下一行走,cnt++,中间的空格为2*所在的行数-1,总的字符加上中间的空格(不包括前面的)为2*所在行+1,满足等差数列,大部分打印的对称图像的常规题型可以采用这种思路。