【每日蓝桥】8、一三年省赛JavaC组真题“打印十字图”

你好呀,我是灰小猿,一个超会写bug的程序猿!

欢迎大家关注我的专栏“每日蓝桥”,该专栏的主要作用是和大家分享近几年蓝桥杯省赛及决赛等真题,解析其中存在的算法思想、数据结构等内容,帮助大家学习到更多的知识和技术!

题目标题:打印十字图

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

【每日蓝桥】8、一三年省赛JavaC组真题“打印十字图”_第1张图片

对方同时也需要在电脑dos窗口中以字符形式输出该标志,并能任意控制层数,

为了能准确的对比空白的数量,程序要求对行中空白以句点(.)代替

 

输入格式:一个正整数 n(n<30)表示要求打印的图形的层数

输出:

对应包围层数的该标志

如:用户输入:

1

程序应该输出:

【每日蓝桥】8、一三年省赛JavaC组真题“打印十字图”_第2张图片

 

再如:用户输入

3

程序应该输出:

【每日蓝桥】8、一三年省赛JavaC组真题“打印十字图”_第3张图片

 

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

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

CPU消耗 < 1000ms

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

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

注意:main函数需要返回0

注意:只使用ANSI C/ANSI C++ 标准,不要调用依赖于编译环境或操作系统的特殊函数

注意:所有依赖的函数必须明确的在源文件中,#include 不能通过工程设置而忽略常用头文件

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

解题思路:

本题的重点是要仔细观察每一层图形所具有的特征,然后推断出每一行存在的规律。

在这道题中的思路是:首先找到每一行打印的规律,然后先能够将每一层图形单独打印出来,然后利用二维数组,将每一层中“$”符的位置记录在二维数组中,最后整个二维数组存放的就是整个图形的数据,然后将二维数组输出即可。

答案源码:

package 一三年省赛真题;

import java.util.Scanner;

public class Year2013_t8 {

	public static void main(String[] args) {
		Scanner scanner = new Scanner(System.in);
		int m = scanner.nextInt();
		drawAll(m);
	}
	
	/**
	 * 绘制整个图形
	 * @param m 图形共有多少层
	 * */
	public static void drawAll(int m) {
		int row = 5+4*m;
		int list = 5+4*m;
		String[][] drawArr = new String[row][list];		//建立存放该图形的二维数组
		for (int i = 0; i <= m; i++) {
			drawN(m, i, drawArr);
		}
		
		//将图形输出
		for (int i = 0; i < drawArr.length; i++) {
			for (int j = 0; j < drawArr.length; j++) {
				if (drawArr[i][j]!="$") {
					drawArr[i][j] = ".";
				}
				System.out.print(drawArr[i][j]);
			}
			System.out.println();
		}
	}
	
	
	/**
	 * 画第n层图形
	 * @param m 图形的总层数
	 * @param n 当前绘制的层数
	 * @param drawArr 存放图形的二维数组
	 * */
	public static void drawN(int m,int n,String[][] drawArr) {
		
		int r = 2*(m-n);		//确定该层图形的起始横纵坐标
		int width = 5 + 4*n;	//获取该层图形的最大宽度
		int height = 5 + 4*n;			//获取该层图形的最大高度
		
		//绘制第一行和倒数第一行
		for (int i = 2; i < height-2; i++) {
			drawArr[r+0][r+i] = "$";
			drawArr[r+height-1][r+i] = "$";
		}
		
		//绘制第二行和倒数第二行
		drawArr[r+1][r+2] = "$";
		drawArr[r+1][r+width-3] = "$";
		drawArr[r+height-2][r+2] = "$";
		drawArr[r+height-2][r+width-3] = "$";
		
		//绘制第三行和倒数第三行
		for (int i = 0; i < 3; i++) {
			drawArr[r+2][r+i] = "$";
			drawArr[r+2][r+width-1-i] = "$";
			drawArr[r+height-3][r+i] = "$";
			drawArr[r+height-3][r+width-1-i] = "$";
		}
		
		//绘制第四到倒数第四行
		for (int i = 3; i < height-3; i++) {
			drawArr[r+i][r+0] = "$";
			drawArr[r+i][r+width-1] = "$";
		}
		
	}
	
}

 

输出样例:

【每日蓝桥】8、一三年省赛JavaC组真题“打印十字图”_第4张图片

其中有不足或者改进的地方,还希望小伙伴留言提出,一起学习!

感兴趣的小伙伴可以关注专栏!

灰小猿陪你一起进步!

最后,我正在参加2020年度博客之星的评选,求小伙伴们帮忙投票支持一下哟!

投票链接:https://bss.csdn.net/m/topic/blog_star2020/detail?username=weixin_44985880

【每日蓝桥】8、一三年省赛JavaC组真题“打印十字图”_第5张图片

 

 

你可能感兴趣的:(每日蓝桥,java,编程语言,面试,大数据,算法)