蓝桥杯大赛题-打印十字图

问题描述

小明为某机构设计了一个十字型的徽标(并非红十字会啊),如下所示:

..$$$$$$$$$$$$$..
..$...........$..
$$$.$$$$$$$$$.$$$
$...$.......$...$
$.$$$.$$$$$.$$$.$
$.$...$...$...$.$
$.$.$$$.$.$$$.$.$
$.$.$...$...$.$.$
$.$.$.$$$$$.$.$.$
$.$.$...$...$.$.$
$.$.$$$.$.$$$.$.$
$.$...$...$...$.$
$.$$$.$$$$$.$$$.$
$...$.......$...$
$$$.$$$$$$$$$.$$$
..$...........$..
..$$$$$$$$$$$$$..

对方同时也需要在电脑dos窗口中以字符的形式输出该标志,并能任意控制层数。

输入格式
一个正整数 n (n<30) 表示要求打印图形的层数。
输出格式
对应包围层数的该标志。
样例输入1
1
样例输出1
..$$$$$..
..$...$..
$$$.$.$$$
$...$...$
$.$$$$$.$
$...$...$
$$$.$.$$$
..$...$..
..$$$$$..
样例输入2
3
样例输出2
..$$$$$$$$$$$$$..
..$...........$..
$$$.$$$$$$$$$.$$$
$...$.......$...$
$.$$$.$$$$$.$$$.$
$.$...$...$...$.$
$.$.$$$.$.$$$.$.$
$.$.$...$...$.$.$
$.$.$.$$$$$.$.$.$
$.$.$...$...$.$.$
$.$.$$$.$.$$$.$.$
$.$...$...$...$.$
$.$$$.$$$$$.$$$.$
$...$.......$...$
$$$.$$$$$$$$$.$$$
..$...........$..
..$$$$$$$$$$$$$..
提示

请仔细观察样例,尤其要注意句点的数量和输出位置。



图片参考自如下链接http://www.cnblogs.com/shendiao/archive/2013/05/05/3061340.html

点击打开链接

本人的解法是,通过观察最外层的个数与输入n的关系为4n+5

    一:先打印中心的十字架

    二:找准4个顶点,分别找到相邻的2个点


参考答案


#include<stdio.h>
int main()
{
	 char a[130][130];  
    int n,i,j,di,dj,k,l,m;  
    scanf("%d",&n);  
    m=4*n+5;  
    //先都放置为‘.’  
    for(i=0; i<m; i++)  
        for(j=0; j<m; j++)  
            a[i][j]='.';  
    //打印十字形  
    for(i=-2; i<=2; i++)  //十字架竖条 
        a[m/2+i][m/2]='$';  
    for(j=-2; j<=2; j++)  //十字架横条 
        a[m/2][m/2+j]='$';  
	
	 //为打印外围做好准备  
    di=0;  
    dj=m;  
    k=0;  
    l=m;  
    //打印外围上下左右的边,同时补好4角的12个方块  
    while(n--)  //共有n个外框 
    {  
     di=di+2;
     dj=dj-2;
       for(i=di;i<dj;i++)
	   {
		a[k][i]='$';
		a[l-1][i]='$';
	   } 
	   for(i=di;i<dj;i++)
	   {
	   	a[i][k]='$';
	   	a[i][l-1]='$';
	   }
	   //下面打印剩余边框的12个点
	   //首先找准4个中心点 
	   //上左 
	   a[k+2][k+2]='$'; 
	   a[k+2-1][k+2]='$';
	   a[k+2][k+2-1]='$';
	   //上右 
	   a[k+2][l-2-1]='$';
	   a[k+2-1][l-2-1]='$';
	   a[k+2][l-2-1+1]='$';
	   //下左 
	   a[l-2-1][k+2]='$';
	   a[l-2-1][k+2-1]='$';
	   a[l-2-1+1][k+2]='$';
	   //下右 
	   a[l-2-1][l-2-1]='$';
	   a[l-2-1+1][l-2-1]='$';
	   a[l-2-1][l-2-1+1]='$'; 
	   k+=2;
	   l-=2;
    }  
	
	
   //输出,每行记得换行。  
    for(i=0; i<m; i++)  
    {  
        for(j=0; j<m; j++)  
        printf("%c",a[i][j]);  
        printf("\n");  
    }  
    return 0; 
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值