藍橋杯【列印十字圖】Java
阿新 • • 發佈:2021-02-10
問題描述
小明為某機構設計了一個十字型的徽標(並非紅十字會啊),如下所示:
..$$$$$$$$$$$$$.. ..$...........$.. $$$.$$$$$$$$$.$$$ $...$.......$...$ $.$$$.$$$$$.$$$.$ $.$...$...$...$.$ $.$.$$$.$.$$$.$.$ $.$.$...$...$.$.$ $.$.$.$$$$$.$.$.$ $.$.$...$...$.$.$ $.$.$$$.$.$$$.$.$ $.$...$...$...$.$ $.$$$.$$$$$.$$$.$ $...$.......$...$ $$$.$$$$$$$$$.$$$ ..$...........$.. ..$$$$$$$$$$$$$..
對方同時也需要在電腦dos視窗中以字元的形式輸出該標誌,並能任意控制層數
輸入格式
一個正整數 n (n<30) 表示要求列印圖形的層數。
輸出格式
對應包圍層數的該標誌。
樣例輸入1
1
樣例輸出1
..$$$$$..
..$...$..
$$$.$.$$$
$...$...$
$.$$$$$.$
$...$...$
$$$.$.$$$
..$...$..
..$$$$$..
樣例輸入2
3
樣例輸出2
..$$$$$$$$$$$$$.. ..$...........$.. $$$.$$$$$$$$$.$$$ $...$.......$...$ $.$$$.$$$$$.$$$.$ $.$...$...$...$.$ $.$.$$$.$.$$$.$.$ $.$.$...$...$.$.$ $.$.$.$$$$$.$.$.$ $.$.$...$...$.$.$ $.$.$$$.$.$$$.$.$ $.$...$...$...$.$ $.$$$.$$$$$.$$$.$ $...$.......$...$ $$$.$$$$$$$$$.$$$ ..$...........$.. ..$$$$$$$$$$$$$..
解題思路
建立一個二維陣列用於繪製十字圖,首先將所有位置初始為‘.’,定義x=2為開始繪製的位置下標,然後將位置為x ~ (x-n)的列和行繪製為‘$’,如下:
..$$$$$..
..$$$$$..
$$$$$$$$$
$$$$$$$$$
$$$$$$$$$
$$$$$$$$$
$$$$$$$$$
..$$$$$..
..$$$$$..
然後x++,切換畫筆繼續繪製,將內圈位置為x ~ (x-n)的列和行繪製為‘.’,如下:
..$$$$$.. ..$...$.. $$$...$$$ $.......$ $.......$ $.......$ $$$...$$$ ..$...$.. ..$$$$$..
繼續重複以上步驟,x自加,不斷切換畫筆進行繪製,直至中間位置繪製完成,即中間的十字圖案出現。
..$$$$$..
..$...$..
$$$.$.$$$
$...$...$
$.$$$$$.$
$...$...$
$$$.$.$$$
..$...$..
..$$$$$..
程式碼實現
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt() * 4 + 5;// 求出圖的邊長
char[][] arr = new char[n][n];// 定義畫布
for (int i = 0; i < n; i++) {// 將畫布全部繪製上 '.'
for (int j = 0; j < n; j++) {
arr[i][j] = '.';
}
}
int x = 2, // 起筆位置
mid = n / 2;// 中間位置
boolean flag = true;// 控制畫筆的切換('$' or '.')
while (x <= mid) {// 當未繪製到中間位置時(夢寐以求的十字尚未出現)
for (int i = x; i < n - x; i++) {// 豎著來一筆(使用刷子,因為刷子足夠寬!)
for (int j = x - 2; j < n - (x - 2); j++) {
if (flag)
arr[i][j] = '$';
else
arr[i][j] = '.';
}
}
for (int j = x; j < n - x; j++) {// 橫著來一筆(不要怕重複塗鴉,顏料多得是!)
for (int i = x - 2; i < n - (x - 2); i++) {
if (flag)
arr[i][j] = '$';
else
arr[i][j] = '.';
}
}
x++;// 繪製面積縮一圈,換個細點的刷子
flag = !flag;// 切換畫筆
}
for (int i = 0; i < n; i++) {// 繪製完成,列印傑作!
for (int j = 0; j < n; j++) {
System.out.print(arr[i][j]);
}
System.out.println();
}
}
}