XTU oj 1372 X

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,满足等差数列,大部分打印的对称图像的常规题型可以采用这种思路。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值