蓝桥杯历届试题 打印十字图

问题描述

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

..$$$$$$$$$$$$$..
..$………..$..
$$$.$$$$$$$$$.$$$
$…$…….$…$
$.$$$.$$$$$.$$$.$
$.$…$…$…$.$
$.$.$$$.$.$$$.$.$
$.$.$…$…$.$.$
$.$.$.$$$$$.$.$.$
$.$.$…$…$.$.$
$.$.$$$.$.$$$.$.$
$.$…$…$…$.$
$.$$$.$$$$$.$$$.$
$…$…….$…$
$$$.$$$$$$$$$.$$$
..$………..$..
..$$$$$$$$$$$$$..

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

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

#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”);

    }

    return;

}

//主函数

int main()

{

    int n = 0;

    scanf(“%d”,&n);

    Decphoto(n);

    return 0;

}

原帖:

http://blog.csdn.net/jopus/article/details/19091643

发表评论