打印十字图

问题描述


小明为某机构设计了一个十字型的徽标(并非红十字会啊),如下所示:
..$$$$$$$$$$$$$..
..$...........$..
$$$.$$$$$$$$$.$$$
$...$.......$...$
$.$$$.$$$$$.$$$.$
$.$...$...$...$.$
$.$.$$$.$.$$$.$.$
$.$.$...$...$.$.$
$.$.$.$$$$$.$.$.$
$.$.$...$...$.$.$
$.$.$$$.$.$$$.$.$
$.$...$...$...$.$
$.$$$.$$$$$.$$$.$
$...$.......$...$
$$$.$$$$$$$$$.$$$
..$...........$..
..$$$$$$$$$$$$$..

对方同时也需要在电脑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] = '$';
        }
    }
}

参考来源

猜你喜欢

转载自blog.csdn.net/cactus_lrg/article/details/79682576