特殊的正方形

一. 题目描述

输入nn,输出nn行nn列的由+.组成的正方形,其中最外面一圈全是+,第二圈全是.,…,对于第ii圈,如果ii是奇数,那么全是+,否则全是.

输入格式

一行,一个整数n。

输出格式

n行,为满足题目要求的正方形。注意不要有行末空格。

样例输入

1
10

样例输出

1
2
3
4
5
6
7
8
9
10
++++++++++
+........+
+.++++++.+
+.+....+.+
+.+.++.+.+
+.+.++.+.+
+.+....+.+
+.++++++.+
+........+
++++++++++

数据范围

对于100%的数据,保证2≤n≤100。

二. 笔者见解

由题目示例可见,该图形是一个中心对称图形,当要打印此类图形时我们可以使用对称思想

1.打印左上角的1/4图形

2.利用左右对称原理打印图形的右半部分(左右对称x轴改变y轴不改变)

3.利用上下对称原理打印图形的下半部分(上下对称y轴改变x轴不改变)

三. 作者代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
import java.util.Scanner;
/**
* 顾名思义回型为环形图案
* 可以把其从中间分成四个一样的图形
* 依次可以把其分为四个相类似的部分来写
**/
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int n;
//打印空心正方形
while(true){
//打印回型左上方图形
n = scanner.nextInt();
char[][] arr = new char[n+1][n+1];
for (int i = 1; i <= (n+1)/2 ; i++) {
if(i%2 == 1){
for (int j = i; j <= (n+1)/2; j++) {
arr[j][i]='*';
arr[i][j]='*';
}
}else{
for (int j = i; j <= (n+1)/2; j++) {
arr[j][i]='.';
arr[i][j]='.';
}
}
}

//建立右上角图案,对称结构
for(int i=1;i<=(n+1)/2;i++){
for(int j=(n+1)/2+1;j<=n;j++){
//左右对称,y轴不变,x轴为n-j+1
arr[j][i]=arr[n-j+1][i];
}
}

//建立上下对称结构
for(int i=1;i<=n;i++){
for(int j=(n+1)/2+1;j<=n;j++){
//在上下对称中,x轴不变,y轴为n-j+1
arr[i][j] = arr[i][n-j+1];
}
}

for (int i = 1; i <= n; i++) {
for (int j = 1; j <= n; j++) {
System.out.print(arr[i][j]);
}
System.out.println();
}

}

}

}

四. 运行结果

image-20220228202402758