[蓝桥杯][2013年第四届真题]打印十字图 (模拟)

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

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

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

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

输入

一个正整数  n  (n< 30)  表示要求打印图形的层数。  

输出

对应包围层数的该标志。

样例输入

3  

样例输出

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

分析:本题输入的数量即为十字标志外环的数量,可以利用递归的方法,由大圈向小圈递归或者由小圈向大圈递归(我这里选择由大圈向小圈递归)只要递归最后满足输入数量即可。其中图中的十字大小是始终不变的,我们可以先初始化一个矩阵,宽度为(2+2*n)*2+1。然后再先初始化中间的十字(无论怎样十字是不会变的),在逐个递归外环即可。

#include<stdio.h>
char Map[300][300];//定义要输出的矩阵
int n,line;
void print(int line);
int main()
{
    while(scanf("%d",&n)!=EOF){
        line = (2+2*n)*2+1;
        for(int i=0;i<line;i++)     //初始化矩阵
            for(int j=0;j<line;j++)
                Map[i][j] = '.';

        for(int i=0;i<5;i++)
        {
            Map[2*n+i][2*n+2]='$';  //无论怎样,矩阵中间的十字是
            Map[2*n+2][2*n+i]='$';  //始终不变的可以先进行定义
        }
        print(0);//递归矩阵中的环
        for(int i=0;i<line;i++)
        {
            for(int j=0;j<line;j++) //输出矩阵
                printf("%c",Map[i][j]);
            printf("\n");
        }
    }
}
void print(int num)
{
    if(num == n)  return;
    for(int i =2*num+2 ; i<line-num*2-2 ;i++)
    {
        Map[2*num][i] = '$';
        Map[line-2*num-1][i] = '$';
    }
    Map[2*num+1][2*num+2] = '$';
    Map[2*num+1][line-2*num-3] = '$';
    Map[line-2*num-2][2*num+2] = '$';
    Map[line-2*num-2][line-2*num-3] = '$';
    for(int i=0; i<3; i++)
    {
        Map[2*num+2][2*num+i] = '$';
        Map[2*num+2][line-2*num-i-1] = '$';
        Map[line-2*num-3][2*num+i] = '$';
        Map[line-2*num-3][line-2*num-i-1] = '$';
    }
    for(int i=2*num+3;i<line-2*num-2;i++)
    {
        Map[i][2*num] = '$';
        Map[i][line-2*num-1] = '$';
    }
    print(num+1);
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值