问题描述
小明为某机构设计了一个十字型的徽标(并非红十字会啊),如下所示:
..$$$$$$$$$$$$$..
..$...........$..
$$$.$$$$$$$$$.$$$
$...$.......$...$
$.$$$.$$$$$.$$$.$
$.$...$...$...$.$
$.$.$$$.$.$$$.$.$
$.$.$...$...$.$.$
$.$.$.$$$$$.$.$.$
$.$.$...$...$.$.$
$.$.$$$.$.$$$.$.$
$.$...$...$...$.$
$.$$$.$$$$$.$$$.$
$...$.......$...$
$$$.$$$$$$$$$.$$$
..$...........$..
..$$$$$$$$$$$$$..
对方同时也需要在电脑dos窗口中以字符的形式输出该标志,并能任意控制层数。
输入格式
一个正整数 n (n<30) 表示要求打印图形的层数。
输出格式
对应包围层数的该标志。
样例输入1
1
样例输出1
..$$$$$..
..$...$..
$$$.$.$$$
$...$...$
$.$$$$$.$
$...$...$
$$$.$.$$$
..$...$..
..$$$$$..
样例输入2
3
样例输出2
..$$$$$$$$$$$$$..
..$...........$..
$$$.$$$$$$$$$.$$$
$...$.......$...$
$.$$$.$$$$$.$$$.$
$.$...$...$...$.$
$.$.$$$.$.$$$.$.$
$.$.$...$...$.$.$
$.$.$.$$$$$.$.$.$
$.$.$...$...$.$.$
$.$.$$$.$.$$$.$.$
$.$...$...$...$.$
$.$$$.$$$$$.$$$.$
$...$.......$...$
$$$.$$$$$$$$$.$$$
..$...........$..
..$$$$$$$$$$$$$..
提示
请仔细观察样例,尤其要注意句点的数量和输出位置。
求解:
NO.1
思路:
采用二维数组保存图形
先绘制出最中心十字
由外及内依次绘制外围图形
代码如下:
import java.util.Arrays;
import java.util.Scanner;
public class Main {
private static int length;
private static char[][] arr;
public static void main(String[] args) {
//初始化数组
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
sc.close();
arr = new char[5 + 4 * n][5 + 4 * n];
length = 5 + 4 * n;
for(int i = 0; i < length; i++) {
Arrays.fill(arr[i],'.');
}
//初始化图像
//初始化最中间十字
for(int i = 0; i < 5; i++) {
arr[length / 2][i + 2 * n] = '$';
arr[i + 2 * n][length / 2] = '$';
}
//从最外层依次向内画图
int x = 0, y = 2;
while(n > 0) {
draw(x, y);
x += 2;
y += 2;
n--;
}
//显示图像
for(int i = 0; i < length; i++) {
for(int j = 0; j < length; j++) {
System.out.print(arr[i][j]);
}
System.out.println();
}
}
private static void draw(int x, int y) {
//绘制顶层和底层
for(int i = y; i < length - y; i++) {
arr[length - 1 - x][i] = arr[x][i] = '$';
}
//绘制第二层和倒数第二层
arr[x + 1][y] = arr[x + 1][length - 1 - y] = '$';
arr[length -2 -x][y] = arr[length - 2 -x][length - 1 - y] = '$';
//绘制第三层和倒数第三层
for(int i = 0; i < 3; i++) {
arr[x + 2][y - i] = arr[x + 2][length - 1 - y + i] = '$';
arr[length - 3 - x][y - i] = arr[length - 3 - x][length - 1 - y + i] = '$';
}
//绘制中间层
for(int i = x + 3; i < length - x - 3; i++) {
arr[i][x] = arr[i][length - 1 - x] = '$';
}
}
}