問題描述
小明為某機構設計了一個十字型的徽標(并非紅十字會啊),如下所示:
..$$$$$$$$$$$$$..
..$...........$..
$$$.$$$$$$$$$.$$$
$...$.......$...$
$.$$$.$$$$$.$$$.$
$.$...$...$...$.$
$.$.$$$.$.$$$.$.$
$.$.$...$...$.$.$
$.$.$.$$$$$.$.$.$
$.$.$...$...$.$.$
$.$.$$$.$.$$$.$.$
$.$...$...$...$.$
$.$$$.$$$$$.$$$.$
$...$.......$...$
$$$.$$$$$$$$$.$$$
..$...........$..
..$$$$$$$$$$$$$..
..$...........$..
$$$.$$$$$$$$$.$$$
$...$.......$...$
$.$$$.$$$$$.$$$.$
$.$...$...$...$.$
$.$.$$$.$.$$$.$.$
$.$.$...$...$.$.$
$.$.$.$$$$$.$.$.$
$.$.$...$...$.$.$
$.$.$$$.$.$$$.$.$
$.$...$...$...$.$
$.$$$.$$$$$.$$$.$
$...$.......$...$
$$$.$$$$$$$$$.$$$
..$...........$..
..$$$$$$$$$$$$$..
對方同時也需要在電腦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 }
?