您的位置:首页 > 其它

蓝桥杯:打印十字图

2014-02-11 23:45 183 查看
  历届试题 打印十字图  

时间限制:1.0s   内存限制:256.0MB

问题描述

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

输入格式

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

输出格式

对应包围层数的该标志。

样例输入1

1

样例输出1

..$$$$$..

..$...$..

$$$.$.$$$

$...$...$

$.$$$$$.$

$...$...$

$$$.$.$$$

..$...$..

..$$$$$..

样例输入2

3

样例输出2

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

提示

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

问题分析:

当我看到这个题目的时候,密密麻麻的完全看不出来哪里有个十字嘛。将上面的文字符号图像形象化一下,如下图:



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



我们将图片左上角分成3个区域。好了,接下来说说我们的打印思路:

思路:

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

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

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

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

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

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

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

附录:(对称性+数列 打印图形)

/*
Name: 蓝桥杯:打印十字图
Copyright: 供交流
Author: Jopus
Date: 06/02/14 11:45
Description: dev-cpp 5.5.3
*/
#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;
}

提交序号姓名试题名称提交时间 


代码长度语言
C
C++
JAVA
评测结果
正确
错误
编译出错
运行错误
运行超时
内存超限
得分
100
1~99
0
CPU使用 


内存使用 


评测详情
62686Jopus打印十字图02-07 16:422.264KBC正确1000ms796.0KB评测详情

转载请保留原文地址:http://blog.csdn.net/jopus/article/details/19091643

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息