博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
蓝桥杯 打印十字图
阅读量:5135 次
发布时间:2019-06-13

本文共 3094 字,大约阅读时间需要 10 分钟。

转载自: https://www.cnblogs.com/cao-lei/p/6637202.html

 

题目标题:打印十字图

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

                                

 

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

为了能准确比对空白的数量,程序要求对行中的空白以句点(.)代替。

输入格式:

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

输出:

对应包围层数的该标志。

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

 

目解析:
  当 n = 1 时,
                       图1
 
 
  当 n = 2 时,
                    图2
 
  
  由题目提供的图形,我们首先找一下行数的规律:
    1   ——   9     (9+4*0)  (9+4*1-1)
    2   ——   13   (9+4*1)  (9+4*2-1)
    3   ——   17   (9+4*2)  (9+4*3-1)
  因此,行数的规律为: row = 9+4*(n-1)
  我们一定会想到,将此题显示的图案放在char二维数组mp中。观察图形,发现其为对称图形,找出中心 center = row / 2,以mp[0][0] 至 mp[row][row] 为对称轴,循环打印。因此在打印时可以利用此规律。
  当 n = 1 时,我们首先在数组中所有的单元格中存入 " . "。接着先打印中间的十字 " "1"",即图1中背景颜色为蓝色的部分。然后打印四周的" ",即图1中背景颜色为橙色的部分。然后打印图1中背景颜色为绿色和紫色的部分。最后将紫色部分变为 " . "。
  当 n = 2 时,我们发现在 n = 1 时打印的图形外增加了 n = 1 时外侧一周的图形。因此,我们找到了打印十字图的规律。
    1、在所有的单元格中存放 " . ";
    2、打印中间的十字图形(图中背景颜色为蓝色);
    3、循环打印剩余图形(用 layer 来控制打印的圈数,layer 从 0 开始到 n 结束):
      3.1、打印一圈四周图形(图中背景颜色为橙色);
      3.2、打印一圈图中背景颜色为绿色和紫色的图形,并将图中背景颜色为紫色的单元格变 " . ";
      3.3、layer++,转 3.1 继续执行。

 

 

1 #include
2 #include
3 #include
4 #include
5 #include
6 #include
7 #include
8 9 using namespace std;10 11 char mp[200][200];12 13 //打印十字图14 void print(int n)15 {16 int row = 9 + 4 * (n - 1); //计算出行数17 18 for (int i = 0; i < row; i++) //先在所有单元格中存入 "."19 {20 for (int j = 0; j < row; j++)21 {22 mp[i][j] = '.';23 }24 }25 26 int center = row / 2; //找出中心27 for (int i = center - 2; i <= center + 2; i++) //打印中心十字(图中背景颜色为蓝色)28 {29 mp[center][i] = '$';30 mp[i][center] = '$';31 }32 33 34 for (int layer = 0; layer < n; layer++) //layer:控制打印的圈数35 {36 //打印四周图形(图中背景颜色为橙色),坐标范围为中心偏左两个单元格开始,中心偏右两个单元格结束,增加一圈即往外增加两个单元格37 for (int x = (center - 2 - 2 * layer); x <= (center + 2 + 2 * layer); x++)38 {39 mp[center - 4 - 2 * layer][x] = '$';40 mp[x][center - 4 - 2 * layer] = '$';41 mp[center + 4 + 2 * layer][x] = '$';42 mp[x][center + 4 + 2 * layer] = '$';43 }44 //打印图中背景颜色为绿色和紫色的图形,坐标范围为中心偏左三个单元格开始,中心偏右三个单元格结束,增加一圈即往外增加两个单元格45 for (int y = center - 3 - 2 * layer; y <= center + 3 + 2 * layer; y++)46 {47 mp[center - 2 - 2 * layer][y] = '$';48 mp[y][center - 2 - 2 * layer] = '$';49 mp[center + 2 + 2 * layer][y] = '$';50 mp[y][center + 2 + 2 * layer] = '$';51 }52 //将背景颜色为紫色的单元格变为"."53 mp[center - 2 - 2 * layer][center - 1 - 2 * layer] = '.';54 mp[center - 1 - 2 * layer][center - 2 - 2 * layer] = '.';55 mp[center - 2 - 2 * layer][center + 1 + 2 * layer] = '.';56 mp[center - 1 - 2 * layer][center + 2 + 2 * layer] = '.';57 mp[center + 2 + 2 * layer][center - 1 - 2 * layer] = '.';58 mp[center + 1 + 2 * layer][center - 2 - 2 * layer] = '.';59 mp[center + 2 + 2 * layer][center + 1 + 2 * layer] = '.';60 mp[center + 1 + 2 * layer][center + 2 + 2 * layer] = '.';61 }62 63 //输出图形64 for (int i = 0; i < row; i++)65 {66 for (int j = 0; j < row; j++)67 {68 cout << mp[i][j];69 }70 printf("\n");71 }72 73 }74 75 int main()76 {77 78 int n;79 while (cin >> n)80 print(n);81 82 return 0;83 }

 

转载于:https://www.cnblogs.com/FengZeng666/p/10541016.html

你可能感兴趣的文章
salt-stack的数据系统Grains
查看>>
1.line (线)
查看>>
41.纯 CSS 绘制一支栩栩如生的铅笔
查看>>
js执行引擎(js解释器)
查看>>
UML-6.1-用例-示例
查看>>
浅析Java中CountDownLatch用法
查看>>
C# MVC 实现登录的5种方式
查看>>
shell定时任务
查看>>
P1966 火柴排队
查看>>
HDU 2031 进制转换(10进制转R进制)
查看>>
前端开源项目周报0412
查看>>
Tinkoff Challenge - Elimination Round E. Problem of offices
查看>>
CentOS工作内容(三)配置网络IP地址
查看>>
ASP.NET 中 对GridView(网格视图)的查、分页、编辑更新、删除操作
查看>>
小数据池、is 和 ==的区别
查看>>
CSS常用样式--background
查看>>
正睿 2019 省选附加赛 Day1 T1 考考试
查看>>
一起学习MVC(3)Views的学习
查看>>
网络流板子(Dicnic)
查看>>
Linux内核参数详解
查看>>