历届试题 打印十字图

问题描述

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

....................$...............$.$..
...........
..$.$.............
................
..$.$...............$.$..
.............
$.$....................

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

输入格式
一个正整数 n (n<30) 表示要求打印图形的层数。
输出格式
对应包围层数的该标志。
样例输入1
1
样例输出1
............$.......
........
$.$............
样例输入2
3
样例输出2
....................$...............$.$..
...........
..$.$.............
................
..$.$...............$.$..
.............
$.$....................
提示
请仔细观察样例,尤其要注意句点的数量和输出位置。
思路:我在做这道题的时候发现整个矩阵是中心对称,其他的规律一直没有找到,直到看到下面这张图
才发现这个矩阵要表达的图案是这个样子的,很无语,。仔细观察这个图我们发现他是中间一个红色的十,然后向外不断扩展的一层层的环,n代表环数,,所以我们可以在程序中一层层生成。因为整个图案是中心对称的,我们可以先求四分之一,在此基础上扩展为二分之一,再扩展为全部。
代码如下
复制代码
 1 import java.util.Scanner;
 2 
 3     public class Main{
 4         
 5         public static void main(String[] args){ 
 6             Scanner scanner=new Scanner(System.in);
 7             int n=scanner.nextInt();
 8             answer(n);
 9             
10         }
11        public  static void answer(int n)
12        {
13            
14            int m=5+4*n;
15            int middle=m/2+1;
16            char array[][]=new char[m+1][m+1];
17            for (int i = 1; i <= m; i++) {
18             for (int j = 1; j <= m; j++) {
19                 array[i][j]='.';
20             }
21         }
22            for (int i = -2; i <=2; i++) {//初始化中间的十字
23             array[middle+i][middle]='$';
24            }
25            for (int j = -2; j <=2; j++) {
26                array[middle][middle+j]='$';
27             }
28            for (int i = 0; i < n; i++) {//表示层数
29             for (int j = middle-4-2*i; j <=middle; j++) {//1表示左上的一部分2表示右半部分
30                 for (int j2 = middle-4-2*i; j2 <=middle; j2++) {
31                     if(j2!=middle-4-2*i && j2!=middle-3-2*i&&j==middle-4-2*i)
32                     {
33                         array[j][j2]='$';//1
34                         array[j][m-j2+1]='$';//2
35                     }
36                     if(j!=middle-4-2*i && j!=middle-3-2*i&&j2==middle-4-2*i) {
37                         array[j][j2]='$';//1
38                         array[j][m-j2+1]='$';//2
39                     }
40                     if((j==middle-4-2*i || j==middle-3-2*i || j==middle-2-2*i)&&j2==middle-2-2*i) {
41                         array[j][j2]='$';//1
42                         array[j][m-j2+1]='$';//2
43                     }
44                     if((j2==middle-4-2*i || j2==middle-3-2*i || j2==middle-2-2*i)&&j==middle-2-2*i) {
45                         array[j][j2]='$';//1
46                         array[j][m-j2+1]='$';//2
47                     }
48                 }
49             }
50             
51           }
52            for (int i = 1; i <= m/2; i++) {//扩展为全部。
53             for (int j = 1; j <= m; j++) {
54                 array[m+1-i][j]=array[i][j];
55             }
56         }
57            for (int i = 1; i <=m; i++) {
58                for (int j = 1; j <=m; j++) {
59                    System.out.print(array[i][j]);
60                }
61                System.out.println();
62            }
63        }
64  }
复制代码

 

posted @   你的雷哥  阅读(604)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 25岁的心里话
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!
· 零经验选手,Compose 一天开发一款小游戏!
点击右上角即可分享
微信分享提示