zoukankan      html  css  js  c++  java
  • java实现 历届试题 蓝桥杯 打印十字图

    历届试题 打印十字图
    题目描述
    小明为某机构设计了一个十字型的徽标(并非红十字会啊),如下所示(可参见p1.jpg)

    对方同时也需要在电脑dos窗口中以字符的形式输出该标志,并能任意控制层数。
    
    为了能准确比对空白的数量,程序要求对行中的空白以句点(.)代替。
    

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

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

    例如:
    用户输入:
    1
    程序应该输出:
    在这里插入图片描述

    再例如:
    用户输入:
    3
    程序应该输出:
    在这里插入图片描述

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

    资源约定:
    峰值内存消耗(含虚拟机) < 64M
    CPU消耗 < 1000ms

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

    所有代码放在同一个源文件中,调试通过后,拷贝提交该源码。
    注意:不要使用package语句。不要使用jdk1.6及以上版本的特性。

    在这里插入图片描述
    问题分析:
    当我看到这个题目的时候,密密麻麻的完全看不出来哪里有个十字嘛。将上面的文字符号图像形象化一下,如下图:

    这张图,中间是个十字,外面是一层一层的圈。我们再加几条线,就能更清晰一些了。如下图:

    我们将图片左上角分成3个区域。好了,接下来说说我们的打印思路:

    思路:
    (我们只打印 ’ $ ',不打印 ’ . ’ )
    第一步:将整个图片全部初始化为白色格子(我们只打印红色格子)。

    第二步:打印中心十字(也可以只打印左上角部分的十字)。

    第三步:打印A区域,从图片的中心点开始(注意规律:1,3,5,7个数)。

    第四步:打印C区域,同样从中心开始打印(注意规律)

    第五步:沿着对角线打印B区域。(OK现在基本上打印完毕了)

    第六步:根据对称性,我们将图片(左右对折,上下对折,沿着对角线对折),OK图片打印完毕。

    ps:这里有个需要注意的地方,就是打印的时候,不要加空格,你看它的图形是长方形的,如果你加上了空格就变成了正方形的了。

    import java.util.Scanner;
    
    public class 打印十字图 {
    	  public static void getResult(int n) {
    	        int len = 5 + 4 * n;
    	        int mid = len / 2;
    	        char[][] result = new char[len][len];
    	        for(int i = 0;i < len;i++)
    	            for(int j = 0;j < len;j++)
    	                result[i][j] = '.';
    	        //中间的3*3的直线
    	        for(int i = mid - 2;i <= mid + 2;i++) {
    	            result[mid][i] = '$';
    	            result[i][mid] = '$';
    	        }
    	        //这里是从中心向外进行更改
    	        for(int i = 1;i <= n;i++) {
    	        	//各个方向的连线,上下左右四个方向的连线
    	            for(int j = mid - 2 * i;j <= mid + 2 * i;j++) {
    	                result[mid - 2 * (i + 1)][j] = '$';
    	                result[mid + 2 * (i + 1)][j] = '$';
    	                result[j][mid - 2 * (i + 1)] = '$';
    	                result[j][mid + 2 * (i + 1)] = '$';
    	            }
    //	            for(int i1 = 0;i1 < len;i1++) {
    //		            for(int j = 0;j < len;j++) {
    //		                System.out.print(result[i1][j]);
    //		            }
    //		            System.out.println();
    //		        }
    	            //这里的三个点就是四个角方向的直角的三个点
    	            //左上角
    	            result[mid - 2 * i][mid - 2 * i] = '$';
    	            result[mid - 2 * i][mid - 2 * i - 1] = '$';
    	            result[mid - 2 * i - 1][mid - 2 * i] = '$';
    	            //右上角
    	            result[mid - 2 * i][mid + 2 * i] = '$';
    	            result[mid - 2 * i - 1][mid + 2 * i] = '$';
    	            result[mid - 2 * i][mid + 2 * i + 1] = '$';
    	            //左下角
    	            result[mid + 2 * i][mid - 2 * i] = '$';
    	            result[mid + 2 * i][mid - 2 * i - 1] = '$';
    	            result[mid + 2 * i + 1][mid - 2 * i] = '$';
    	            //右下角
    	            result[mid + 2 * i][mid + 2 * i] = '$';
    	            result[mid + 2 * i][mid + 2 * i + 1] = '$';
    	            result[mid + 2 * i + 1][mid + 2 * i] = '$';
    	        }
    	        for(int i = 0;i < len;i++) {
    	            for(int j = 0;j < len;j++) {
    	                System.out.print(result[i][j]);
    	            }
    	            System.out.println();
    	        }
    	    }
    	    
    	    public static void main(String[] args) {
    	        
    	        Scanner in = new Scanner(System.in);
    	        int n = in.nextInt();
    	        getResult(n);
    	    }
    }
    
    
    
  • 相关阅读:
    Jzoj4822 完美标号
    Jzoj4822 完美标号
    Jzoj4792 整除
    Jzoj4792 整除
    Educational Codeforces Round 79 A. New Year Garland
    Good Bye 2019 C. Make Good
    ?Good Bye 2019 B. Interesting Subarray
    Good Bye 2019 A. Card Game
    力扣算法题—088扰乱字符串【二叉树】
    力扣算法题—086分隔链表
  • 原文地址:https://www.cnblogs.com/a1439775520/p/13079262.html
Copyright © 2011-2022 走看看