1. 程式人生 > 其它 >藍橋杯【列印十字圖】Java

藍橋杯【列印十字圖】Java

技術標籤:藍橋字串演算法java陣列

問題描述

小明為某機構設計了一個十字型的徽標(並非紅十字會啊),如下所示:

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

對方同時也需要在電腦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();
		}
	}
}

執行截圖

在這裡插入圖片描述