• 蓝桥杯 打印十字图


    转载自: 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<iostream>
     2 #include<string>
     3 #include<queue>
     4 #include<set>
     5 #include<cmath>
     6 #include<algorithm>
     7 #include<stdio.h>
     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("
    ");
    71     }
    72 
    73 }
    74 
    75 int main()
    76 {
    77 
    78     int n;
    79     while (cin >> n)
    80         print(n);
    81 
    82     return 0;
    83 }
  • 相关阅读:
    Navicat Premium 12 破解汉化64位 windows版本
    Tkinter入门简明教程
    python tkinter-消息框、对话框、文件对话框
    python中ui自动化selenium方法封装分享
    Windows利用EasyWebSvr起web服务
    Windows安装mysql服务端
    北京个人所得税纳税记录打印
    Java并发之ReentrantReadWriteLock源码解析(二)
    Java并发之ReentrantReadWriteLock源码解析(一)
    Java并发之Semaphore源码解析(二)
  • 原文地址:https://www.cnblogs.com/FengZeng666/p/10541016.html
Copyright © 2020-2023  润新知