打印十字图

问题描述

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

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

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

输入格式
一个正整数 n (n<30) 表示要求打印图形的层数。
输出格式
对应包围层数的该标志。
样例输入1
1
样例输出1
..$$$$$..
..$...$..
$$$.$.$$$
$...$...$
$.$$$$$.$
$...$...$
$$$.$.$$$
..$...$..
..$$$$$..
样例输入2
3
样例输出2
..$$$$$$$$$$$$$..
..$...........$..
$$$.$$$$$$$$$.$$$
$...$.......$...$
$.$$$.$$$$$.$$$.$
$.$...$...$...$.$
$.$.$$$.$.$$$.$.$
$.$.$...$...$.$.$
$.$.$.$$$$$.$.$.$
$.$.$...$...$.$.$
$.$.$$$.$.$$$.$.$
$.$...$...$...$.$
$.$$$.$$$$$.$$$.$
$...$.......$...$
$$$.$$$$$$$$$.$$$
..$...........$..
..$$$$$$$$$$$$$..
提示
请仔细观察样例,尤其要注意句点的数量和输出位置。

问题分析:

将上面的文字符号图像形象化一下,如下图:



这张图,中间是个十字,外面是一层一层的圈。我们再加几条线,就能更清晰一些了。如下图:


我们将图片左上角分成3个区域。

打印思路

(我们只打印 ' $ ',不打印 ' . ' )

第一步:将整个图片全部初始化为白色格子(我们只打印红色格子)。

第二步:打印中心十字(也可以只打印左上角部分的十字)。

第三步:打印A区域,从图片的中心点开始(注意规律:1,3,5,7个数)。

第四步:打印C区域,同样从中心开始打印(注意规律)。

第五步:沿着对角线打印B区域。(OK现在基本上打印完毕了)。

第六步:根据对称性,我们将图片(左右对折,上下对折,沿着对角线对折)。


ps:这里有个需要注意的地方,就是打印的时候,不要加空格,你看它的图形是长方形的,如果你加上了空格就变成了正方形的了。

代码:

#include <stdio.h>  
#include <stdlib.h>  
//思路:先摆放左上角所有$图案,然后通过对称性画出其他部分   
void Decphoto(int n)  
{  
    int row = 0,col = 0,i = 0,j = 0,center = 0;  
    int space = 0,num_s = 0,t = 0;    
    row = col = 4 * ( n - 1 ) + 9;//n层时,数组大小   
    int **arr = (int **)malloc(sizeof(int *) * row);//开辟一维数组空间  
    for ( i = 0; i < row; ++i )//动态开辟二维数组空间   
        arr[i] =  (int *)malloc(sizeof(int) * col);  
    
	center = ( row - 1 ) / 2;//数组最中部那点坐标     
	for ( i = 0; i < row; ++i )//全部初始化为'.'   
        for ( j = 0; j < col; ++j )  
            arr[i][j] = '.';  
    for ( i = center - 1; i <= center; ++i )//摆放中心十字图   
    {  
        arr[center][i] = '$';  
        arr[i][center] = '$';     
    }  
    space = center;//摆放$时,前面跳过个数space   
    t = num_s = 1;//需要连续摆放num_s个$   
    
	
    //(A区域)(C区域)    
    for ( i = center-2; i >= 0; i -= 2 )     //摆放上面到中心和左边到中心'$'型 这里从中心往外围摆放$  
    {                                         
        for ( j = space; t > 0; ++j )  
        {  
            arr[i][j] = '$';  
            arr[j][i] = '$';   
            --t;  
        }  
        space -= 2;//注意观察规律   
        t = num_s += 2;  
    }  
    //B区域)   
    for ( i = 1; i < center - 1; i += 2 )//摆放中上对角线  
        arr[i][i+1] = '$';  
    for ( i = 2; i < center; i += 2 )//摆放正对角线   
        arr[i][i] = '$';  
    for ( i = 2; i < center - 1; i += 2 )//摆放中下对角线    
        arr[i][i-1] = '$';  
        
        
    //左上角的图案全部摆放完毕(然后通过对称性对折图形)   
    for ( i = 0; i < ( row + 1) / 2; ++i )//沿对角线对折   
        for ( j = 0; j < ( col + 1) / 2; ++j )  
            arr[row-i-1][col-j-1] = arr[i][j];  
              
    for ( i = 0; i < ( row + 1 ) / 2; ++i )//沿列中线对折   
        for ( j = 0; j < ( col + 1 ) / 2; ++j )  
            arr[i][col-j-1] = arr[i][j];    
              
    for ( i = 0; i < ( row + 1 ) / 2; ++i )//沿行中线对折   
        for ( j = 0; j < ( col + 1 ) / 2; ++j )  
            arr[row-i-1][j] = arr[i][j];  
			  
    
    //打印十字图 
    for ( i = 0; i < row; ++i )  
    {  
        for ( j = 0; j < col; ++j )  
            printf("%c",arr[i][j]);  
        printf("\n");  
    }   
}  
  
int main()  
{  
    int n = 0;  
    scanf("%d",&n);   
    Decphoto(n);  
    return 0;  
}  



  • 5
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值