蓝桥杯:打印十字图
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:这里有个需要注意的地方,就是打印的时候,不要加空格,你看它的图形是长方形的,如果你加上了空格就变成了正方形的了。
时间限制: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使用 | 内存使用 | 评测详情 |
---|---|---|---|---|---|---|---|---|---|---|
62686 | Jopus | 打印十字图 | 02-07 16:42 | 2.264KB | C | 正确 | 100 | 0ms | 796.0KB | 评测详情 |
转载请保留原文地址:http://blog.csdn.net/jopus/article/details/19091643
相关文章推荐
- 蓝桥杯——打印十字图
- 蓝桥杯:打印十字图
- 蓝桥杯-历届试题-打印十字图
- 蓝桥杯 - 打印十字图 (文字图形类)
- 蓝桥杯 打印十字图 (模拟)
- 打印十字图-蓝桥杯历届试题
- 蓝桥杯 —— 打印十字图
- 蓝桥杯 十字图打印
- 蓝桥杯:打印十字图
- 蓝桥杯之 历届试题 打印十字图
- 蓝桥杯-打印十字图-java
- 【蓝桥杯】【打印十字图】
- 蓝桥杯 历届考题 打印十字图 java编写
- 蓝桥杯 打印十字图
- 蓝桥杯 历届试题 打印十字-----------------------C语言——菜鸟级
- 第四届蓝桥杯竞赛打印十字图案问题
- 蓝桥杯 历届试题 打印十字图
- 【蓝桥杯】历届试题 打印十字图
- 蓝桥杯 JAVA 打印十字图
- 蓝桥杯 打印十字图