1、问题描述
小明为某机构设计了一个十字型的徽标(并非红十字会啊),如下所示(可参见p1.jpg)
对方同时也需要在电脑dos窗口中以字符的形式输出该标志,并能任意控制层数。
为了能准确比对空白的数量,程序要求对行中的空白以句点(.)代替。
2、代码实现
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt();
print(n);
}
public static void print(int n) {
//图形的长和宽
int len = 5 + 4 * n;
//先定义,后面会用到
int mid = len / 2;
//定义一个二维数组,用来打印
char[][] map = new char[len][len];
//给这个二维数组全部设置为 '.',后面只需要填充$就可以了
for(int i = 0;i < len;i++) {
for(int j = 0;j < len;j++){
map[i][j] = '.';
}
}
//先弄中间的十字形
for(int i = mid - 2;i <= mid + 2;i++) {
//列
map[i][mid] = '$';
//行
map[mid][i] = '$';
}
//循环几次,十字形外围的环就有几层
for(int i = 1;i <= n;i++) {
//先弄这条环的四条边
for(int j = mid - 2 * i;j <= mid + 2 * i;j++) {
//上边
map[mid - 2 * (i + 1)][j] = '$';
//下边
map[mid + 2 * (i + 1)][j] = '$';
//左边
map[j][mid - 2 * (i + 1)] = '$';
//右边
map[j][mid + 2 * (i + 1)] = '$';
}
//弄四个角
//左上角
map[mid - 2 * i][mid - 2 * i] = '$';
map[mid - 2 * i - 1][mid - 2 * i] = '$';
map[mid - 2 * i][mid - 2 * i - 1] = '$';
//右上角
map[mid - 2 * i][mid + 2 * i] = '$';
map[mid - 2 * i - 1][mid + 2 * i] = '$';
map[mid - 2 * i][mid + 2 * i + 1] = '$';
//左下角
map[mid + 2 * i][mid - 2 * i] = '$';
map[mid + 2 * i][mid - 2 * i - 1] = '$';
map[mid + 2 * i + 1][mid - 2 * i] = '$';
//右下角
map[mid + 2 * i][mid + 2 * i] = '$';
map[mid + 2 * i][mid + 2 * i + 1] = '$';
map[mid + 2 * i + 1][mid + 2 * i] = '$';
}
//打印结果
for(int i = 0;i < len;i++) {
for(int j = 0;j < len;j++){
System.out.print(map[i][j]);
}
System.out.println();
}
}
}