蓝桥杯 题目标题:打印十字图(java)

打印十字图

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

             $$$$$$$$$$$$$
             $           $
           $$$ $$$$$$$$$ $$$
           $   $       $   $
           $ $$$ $$$$$ $$$ $
           $ $   $   $   $ $
           $ $ $$$ $ $$$ $ $
           $ $ $   $   $ $ $
           $ $ $ $$$$$ $ $ $
           $ $ $   $   $ $ $
           $ $ $$$ $ $$$ $ $
           $ $   $   $   $ $
           $ $$$ $$$$$ $$$ $
           $   $       $   $
           $$$ $$$$$$$$$ $$$
             $           $
             $$$$$$$$$$$$$

对方同时也需要在电脑dos窗口中以字符的形式输出该标志,并能任意控制层数
为了能准确比对空白的数量,程序要求对行中的空白以句点(.)代替。
在这里插入图片描述
输入格式:
一个正整数 n (n<30) 表示要求打印图形的层数

输出:
对应包围层数的该标志。

例如:
用户输入:

1

程序应该输出:

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

再例如:
用户输入:

3

程序应该输出:

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

请仔细观察样例,尤其要注意句点的数量和输出位置。

资源约定:
峰值内存消耗 < 64M
CPU消耗 < 1000ms

请严格按要求输出,不要画蛇添足地打印类似:“请您输入…” 的多余内容。

所有代码放在同一个源文件中,调试通过后,拷贝提交该源码。

注意: main函数需要返回0
注意: 只使用ANSI C/ANSI C++ 标准,不要调用依赖于编译环境或操作系统的特殊函数。
注意: 所有依赖的函数必须明确地在源文件中 #include , 不能通过工程设置而省略常用头文件。

提交时,注意选择所期望的编译器类型。

解题思路

假设要打印n层,可以分析出每多打印一层长度增加4,即n层的图形长度
m=4*n+5;
然后把图形分成二个部分考虑直线和三角
在这里插入图片描述

分成二部分后

第一部分三角,我们根据左上角的求得另外三个部分的坐标,这个不复杂,
左上角A(x,y), 对称的右上角B(x,m-y+1)
左下角C(m+1-x, y) 右下角D(m+1-x, m+1-y)
第二部分直线, 左直线L(x,y) , 右直线R(x, m+1-y)
上直线U(y,x), 下直线D(m+1-x, y)

打印左上三角
..$..........
..$..........
$$$.$........
....$........
..$$$.$......
......$......
....$$$......
.............
.............
.............
.............
.............
.............
根据对称打印四个方向的三角
..$.......$..
..$.......$..
$$$.$...$.$$$
....$...$....
..$$$.$.$$$..
......$......
....$$$$$....
......$......
..$$$.$.$$$..
....$...$....
$$$.$...$.$$$
..$.......$..
..$.......$..
打印四个方向的直线
...$$$$$$$...
.............
.....$$$.....
$...........$
$...........$
$.$.......$.$
$.$.......$.$
$.$.......$.$
$...........$
$...........$
.....$$$.....
.............
...$$$$$$$...

代码

package ex1.extest2;

import java.util.Scanner;

public class a02打印十字形 {
    static boolean[][] arr; // 存放结果,true表示$ false 表示空格
    static int m;
    public static void main(String[] args){
        Scanner scanner = new Scanner(System.in);
        int N = scanner.nextInt();
        m = 5+4*N;
        arr = new boolean[m+10][m+10];
        int[] a = {3,3,3,2,1}; // 左上角第一个三角的横坐标
        int[] b = {1,2,3,3,3};// 左上角第一个三角的纵坐标
        for (int i=0; i<=N;i++) {
            for (int j=0; j<5; j++) {
                arr[a[j]+i*2][b[j]+i*2] = true; // 左上
                arr[a[j]+i*2][m+1-b[j]-i*2] = true; // 右上
                arr[m+1-a[j]-i*2][b[j]+i*2] = true; // 左下
                arr[m+1-a[j]-i*2][m+1-b[j]-i*2] = true; // 右下

            }
        }
        for (int i=0; i<=N; i++) {
            for (int j=4+i*2; j<=m-3-i*2; j++) {
                arr[j][1+i*2] = true; // L
                arr[1+i*2][j] = true; // U
                arr[j][m-i*2] = true;  // R
                arr[m-i*2][j] = true;  // D
            }
        }
        for (int i=1; i<=m; i++) {
            for (int j=1; j<=m; j++) {
                if (arr[i][j]){
                    System.out.print('$');
                }else {
                    System.out.print('.');
                }
            }
            System.out.println();
        }
    }
}

打完收工, %%%%%%%%
欢迎有问题的下方评论–_—

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值