蓝桥杯试题----- 打印大X

打印大X


小明希望用星号拼凑,打印出一个大X,他要求能够控制笔画的宽度和整个字的高度。
为了便于比对空格,所有的空白位置都以句点符来代替。


要求输入两个整数m n,表示笔的宽度,X的高度。用空格分开(0<m<n, 3<n<1000, 保证n是奇数)
要求输出一个大X


例如,用户输入:
3 9
程序应该输出:
***.....***
.***...***.
..***.***..
...*****...
....***....
...*****...
..***.***..
.***...***.
***.....***

我自己写的思路是一行行输出的,先输出两边的. 和两边的*,然后中间有.的在处理一下,就可以了。

#include<stdio.h>
#include<string.h>
int main(){
	int n,m,i,j,k,t,p;
	int time;//0打印*,1打印. //保证m为奇数 
	int temp=0;
	int max;
	int min;
    int flag;
	int number; 
	scanf("%d%d",&n,&m);
	char line[1997]; 
	for(i=0;i<m/2+1;i++){
		time = 0;
		number=0;
		for(j=0,k=n+m-2;j<=k;j++,k--){	 //先控制每一行打出左右两边的. 和* 
			if(time!=i){
				line[j]=line[k]='.';
				time++;
			}
			else if(time==i){
				line[j]=line[k]='*';
				number++;
				if(number==n&&j==k){
					max = i;   //记录中间有.的行数 
				}
				if(number==n&&j<k){
					time=(i-(m/2-i)-n);
				}
			}
		}
	    if(max>0&&i<=max){  //控制打印中间的. 
			for(p=n+i;p<=m-2-i;p++){
				line[p]='.';
			}
    	}
		for(j=0;j<=m+n-2;j++)
		printf("%c",line[j]);
		printf("\n");
	}
	temp = time;
	min = m;
    for(t=i;t<m;t++){
		time = 1;
		number=0;
	    for(j=0,k=n+m-2;j<=k;j++,k--){	
			if(time<temp){
				time++;
				line[j]=line[k]='.';
			}
			else if(time == temp){
				line[j]=line[k]='*';
				number++;
			    if(number==n&&j==k){
					min = i;
				}
				if(number==n&&j<k){
					time=(t-(m/2-temp)-n);
				}
			}
		}
		time = --temp;
		if(min<m&&t>=min){
			for(p=temp+n;p<=m-(m-t)-1;p++){
				line[p]='.';
			}
    	}
    	for(j=0;j<=m+n-2;j++)
		printf("%c",line[j]);
		printf("\n");
    }
	return 0;
}

 

转载于:https://www.cnblogs.com/Koaler/p/7268288.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值