zoukankan      html  css  js  c++  java
  • 蓝桥杯 历届试题 PREV-2 打印十字图

    历届试题 打印十字图  
    时间限制:1.0s   内存限制:256.0MB

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

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

    输入格式
    一个正整数 n (n<30) 表示要求打印图形的层数。
    输出格式
    对应包围层数的该标志。
    样例输入1
    1
    样例输出1
    样例输入2
    3
    样例输出2
    提示
    请仔细观察样例,尤其要注意句点的数量和输出位置。
     
    题目解析:
      当 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)
      我们一定会想到,将此题显示的图案放在String数组中。观察图形,发现其为对称图形,找出中心 center = row / 2,以str[0][0] 至 str[row][row] 为对称轴,循环打印。因此在打印时可以利用此规律。
      当 n = 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 import java.io.BufferedReader;
     2 import java.io.IOException;
     3 import java.io.InputStreamReader;
     4 
     5 public class Main {
     6     private static String[][] str; 
     7     public static void main(String[] args) throws IOException{
     8         BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
     9         int n = Integer.parseInt(br.readLine());
    10         
    11         print(n);
    12         
    13     }
    14     
    15     //打印十字图
    16     private static void print(int n) {
    17         int row = 9 + 4 * ( n - 1 );                   //计算出行数
    18         str = new String[row][row];
    19         for(int i = 0; i < row; i++) {                 //先在所有单元格中存入 "."
    20             for(int j = 0; j < row; j++) {
    21                 str[i][j] = ".";
    22             }
    23         }
    24         
    25         int center = row / 2;                           //找出中心
    26         for(int i = center - 2; i <= center + 2; i++){  //打印中心十字(图中背景颜色为蓝色)
    27             str[center][i] = "$";
    28             str[i][center] = "$";
    29         }
    30         
    31         
    32         for(int layer = 0; layer < n; layer++) {        //layer:控制打印的圈数
    33             //打印四周图形(图中背景颜色为橙色),坐标范围为中心偏左两个单元格开始,中心偏右两个单元格结束,增加一圈即往外增加两个单元格
    34             for(int x = (center - 2 - 2*layer); x <= (center + 2 + 2*layer); x++) {
    35                 str[center - 4 - 2*layer][x] = "$";
    36                 str[x][center - 4 - 2*layer] = "$";
    37                 str[center + 4 + 2*layer][x] = "$";
    38                 str[x][center + 4 + 2*layer] = "$";
    39             }
    40             //打印图中背景颜色为绿色和紫色的图形,坐标范围为中心偏左三个单元格开始,中心偏右三个单元格结束,增加一圈即往外增加两个单元格
    41             for(int y = center - 3 - 2*layer; y <= center + 3 +2*layer; y++){
    42                 str[center - 2 - 2*layer][y] = "$";
    43                 str[y][center - 2 - 2*layer] = "$";
    44                 str[center + 2 + 2*layer][y] = "$";
    45                 str[y][center + 2 + 2*layer] = "$";
    46             }
    47             //将背景颜色为紫色的单元格变为"."
    48             str[center - 2 - 2*layer][center - 1 - 2*layer] = ".";
    49             str[center - 1 - 2*layer][center - 2 - 2*layer] = ".";
    50             str[center - 2 - 2*layer][center + 1 + 2*layer] = ".";
    51             str[center - 1 - 2*layer][center + 2 + 2*layer] = ".";
    52             str[center + 2 + 2*layer][center - 1 - 2*layer] = ".";
    53             str[center + 1 + 2*layer][center - 2 - 2*layer] = ".";
    54             str[center + 2 + 2*layer][center + 1 + 2*layer] = ".";
    55             str[center + 1 + 2*layer][center + 2 + 2*layer] = ".";
    56         }
    57         
    58         //输出图形
    59         for(int i = 0; i < row; i++) {
    60             for(int j = 0; j < row; j++) {
    61                 System.out.print(str[i][j]);
    62             }
    63             System.out.printf("
    ");
    64         }
    65         
    66     }
    67 }
     
     
     
  • 相关阅读:
    有关于iphone 音频 录制 播发
    iPhone开发之网络编程 AsyncSocket
    在.NET中使用Speex 音频数据编解码
    下面首先来看GCD的使用
    [已解决] AVAudioRecorder 录音,编码问题
    [转](让你少走十年弯路)四十以后才明白
    怎样才算读懂一本书?
    5000个知识点后怎样?
    DIKW体系 个人知识管理领域中最基础的概念
    个人竞争力 每个人必须悟透的概念
  • 原文地址:https://www.cnblogs.com/cao-lei/p/6637202.html
Copyright © 2011-2022 走看看