蓝桥杯 历届试题 PREV-2 打印十字图
Posted C3Stones
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了蓝桥杯 历届试题 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("\\n"); 64 } 65 66 } 67 }
以上是关于蓝桥杯 历届试题 PREV-2 打印十字图的主要内容,如果未能解决你的问题,请参考以下文章