问题描述
小明为某机构设计了一个十字型的徽标(并非红十字会啊),如下所示:
对方同时也需要在电脑 dos 窗口中以字符的形式输出该标志,并能任意控制层数。
输入格式
- 一个正整数 n (n<30) 表示要求打印图形的层数。
输出格式
- 对应包围层数的该标志。
样例输入 1
1
样例输出 1
样例输入 2
3
样例输出 2
提示
- 请仔细观察样例,尤其要注意句点的数量和输出位置
思路
- 通过观察图得到层数与行、列的关系式为5 +4*n;图形是一个对称图,设置一个中间值mid来进行打印边和角的运算;
- 进行图的初始化,将图形均用.代表;
- 先进行中间十字的打印,十字有行和列,for循环中第一行代码将行定于中间行,改变列的数值进行打印十字的——;for循环中第二行代码定列移行,将列定义为中间列,改变列的数值进行打印十字的|;
- 进行到边然后到角。(图3-图4)
- 横竖打印:横:第一行和最后一行的概率都为行前面和后面两位为..;所以行的打印可以定(mid - 2 * (i + 1))行改列,列的范围第3列至(5+4*n)-2列为符号$,最后一横的概率也一样;
- 边打印:左右两边的概率一样,定列移行;
- 角打印:都可以根据中间值来进行角的定位。利用中间值和层数的来建立一个关系式,先打印里的,再延伸到外的角。
- 最后输出用$替换.的图打印输出
代码
package data;
import java.util.Scanner;
public class Data728 {
public static void main(String[] args) {
Scanner cin = new Scanner(System.in);
int n = cin.nextInt();//输入打印图层的层数;
getPic(n);
}
public static void getPic(int x)//打印图层的函数
{
//一层--9;二层--13,一层一层推进$. .$;
int side = 5 + 4 *x;//正方形的长和宽的长度;
int mid = side / 2;//中间点的值,对称;
char[][] arr = new char[side][side];
for(int i = 0; i<side; i++)
{
//初始化图形,图形均为‘.‘
for (int j = 0; j < side; j++)
{
arr[i][j] = ‘.‘;
}
}
//先进行十字图中间的十字的图形打印;
for(int i = mid - 2; i <= mid +2;i++)
{
arr[mid][i]=‘$‘;
arr[i][mid]=‘$‘;
}
//进行图形的横竖打印
for(int i= 1; i<= x; i++) {
for (int j = mid - 2 * i; j <= mid + 2 * i; j++) {
arr[mid - 2 * (i + 1)][j] = ‘$‘;//第一行
arr[mid + 2 * (i + 1)][j] = ‘$‘;//最后一行
arr[j][mid - 2 * (i + 1)] = ‘$‘;//左外边
arr[j][mid + 2 * (i + 1)] = ‘$‘;//右外边
}
//进行图形的四个转角打印
//左上
arr[mid - 2 * i][mid - 2 * i] = ‘$‘;
arr[mid - 2 * i][mid - 2 * i - 1] = ‘$‘;
arr[mid - 2 * i - 1][mid - 2 * i] = ‘$‘;
//左下
arr[mid + 2 * i][mid - 2 * i] = ‘$‘;
arr[mid + 2 * i][mid - 2 * i - 1] = ‘$‘;
arr[mid + 2 * i + 1][mid - 2 * i] = ‘$‘;
//右上
arr[mid - 2 * i][mid + 2 * i] = ‘$‘;
arr[mid - 2 * i][mid + 2 * i + 1] = ‘$‘;
arr[mid - 2 * i - 1][mid + 2 * i] = ‘$‘;
//右下
arr[mid + 2 * i][mid + 2 * i] = ‘$‘;
arr[mid + 2 * i][mid + 2 * i + 1] = ‘$‘;
arr[mid + 2 * i + 1][mid + 2 * i] = ‘$‘;
}
// 输出
for(int i = 0;i < side;i++)
{
for(int j = 0; j<side; j++)
{
System.out.print(arr[i][j]);
}
System.out.println();
}
}
}