你好呀,我是灰小猿,一个超会写bug的程序猿!
欢迎大家关注我的专栏“每日蓝桥”,该专栏的主要作用是和大家分享近几年蓝桥杯省赛及决赛等真题,解析其中存在的算法思想、数据结构等内容,帮助大家学习到更多的知识和技术!
题目标题:打印十字图
小明为某机构设计了一个十字形的徽标,(并非红十字会啊),如下所示:
对方同时也需要在电脑dos窗口中以字符形式输出该标志,并能任意控制层数,
为了能准确的对比空白的数量,程序要求对行中空白以句点(.)代替
输入格式:一个正整数 n(n<30)表示要求打印的图形的层数
输出:
对应包围层数的该标志
如:用户输入:
1
程序应该输出:
再如:用户输入
3
程序应该输出:
请仔细观察样例,尤其要注意句点的数量和输出位置
资源约定:
峰值内存消耗 < 64MCPU消耗 < 1000ms
请严格按照要求输出,不要画蛇添足的打印类似:“请您输入...”的多余内容。
所有代码都放在同一个源文件中,测试通过后,拷贝提交该源码。
注意:main函数需要返回0
注意:只使用ANSI C/ANSI C++ 标准,不要调用依赖于编译环境或操作系统的特殊函数
注意:所有依赖的函数必须明确的在源文件中,#include<xxx> 不能通过工程设置而忽略常用头文件
提交时,注意选择所期望的编译器类型
解题思路:
本题的重点是要仔细观察每一层图形所具有的特征,然后推断出每一行存在的规律。
在这道题中的思路是:首先找到每一行打印的规律,然后先能够将每一层图形单独打印出来,然后利用二维数组,将每一层中“$”符的位置记录在二维数组中,最后整个二维数组存放的就是整个图形的数据,然后将二维数组输出即可。
答案源码:
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] = "$"; } } }
输出样例: