问题描述
小明为某机构设计了一个十字型的徽标(并非红十字会啊),如下所示:
..$$$$$$$$$$$$$..
..$...........$..
$$$.$$$$$$$$$.$$$
$...$.......$...$
$.$$$.$$$$$.$$$.$
$.$...$...$...$.$
$.$.$$$.$.$$$.$.$
$.$.$...$...$.$.$
$.$.$.$$$$$.$.$.$
$.$.$...$...$.$.$
$.$.$$$.$.$$$.$.$
$.$...$...$...$.$
$.$$$.$$$$$.$$$.$
$...$.......$...$
$$$.$$$$$$$$$.$$$
..$...........$..
..$$$$$$$$$$$$$..
对方同时也需要在电脑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 }
作者:你的雷哥
本文版权归作者所有,欢迎转载,但未经作者同意必须在文章页面给出原文连接,否则保留追究法律责任的权利。