蓝桥杯历届试题:打印十字图

本文探讨了蓝桥杯历届试题中关于打印十字图的问题。作者指出题目中的图形可能误导,实际上是一个正方形,具备四个对称轴。解决思路是先完成一半图形,再利用对称性复制。通过分析图形规律,如每层递增4个美元符,可以实现算法。文章提供了一个Java实现,并鼓励读者分享更简洁的解决方案。
摘要由CSDN通过智能技术生成

题目:
在这里插入图片描述
一开始看到这个问题的时候自己也是完全找不到头脑,而且经过仔细一想之后,这个图本身就有误导作用,因为它看起来根本就是像一个长方形,会严重影响你的思路,建议大家在草稿纸上重新把图画一下,然后你会发现这是一个正方形,并且这个图和标准正方形一样拥有四个对称轴,然后你就会发现其实不难。

我的思路是:完成它的一半,然后根据对称原则复制另半个正方形。
在这里插入图片描述
根据图上线索,你会发现再多层的十字图由内到外都有一个规律,依次是1,5,9,13个美元符递增4个,并且竖着的行每第一个和最后一个美元符向下产生两个符号,你会发现,当你想到这一步时,算法基本上也就可以去实现了。

以下是java算法:

    import java.util.Scanner;
    
    //打印十字
    public class Main {
    	public static void main(String[] args) {
    		Scanner in = new Scanner(System.in);
    		int x = in.nextInt();
    		int row = 4*x+5;
    		int col = row;
    		//全部定义为.的二维字符数组
    		char word[][] = new char[row][col];
    		for(int m=0;m<row;m++) {
    			for(int n=0;n<col;n++) {
    				word[m][n]='.';
    			}
    		}
    		
    		//开始改变内部结构
    		//1
    		int index = (row-3)/2;
    		
    		int fi = (index+1)/2;
    		int finger = fi;
    		for(int m=0;m<index;m=m+2) {
    			int n=m+2;
    			//首个'$'符向下延伸两个‘$’
    			word[m+1][n] = '$';
    			word[m+2][n] = '$';
    			for(n=0+m;n<4*finger-3+m;n++) {
    				word[m][n+2]='$';
    				
    			}
    			//最后一个'$'符向下延伸两个‘$’
    			word[m+1][n+1] = '$';
    			word[m+2][n+1] = '$';
    			finger--;
    		}
    		//2
    		//复原finger
    		finger = fi;
    		for(int m=0;m<index;m=m+2) {
    			int n=m+2;
    			//首个'$'符向下延伸两个‘$’
    			word[n][m+1] = '$';
    			word[n][m+2] = '$';
    			
    			for(n=0+m;n<4*finger-3+m;n++) {
    				word[n+2][m]='$';
    				
    			}
    			finger--;
    			//末尾'$'符向下延伸两个‘$’
    			word[n+1][m+1] = '$';
    			word[n+1][m+2] = '$';
    			
    		}
    		//复制右上角部分
    		for(int a=0;a<(word.length+1)/2;a++) {
    			for(int b=0;b<(word.length+1)/2;b++) {
    				word[a][word.length-b-1]=word[a][b];
    			}
    		}
    		//以上半个二维字符数组复制下半个
    		for(int a=0;a<word.length;a++) {
    			for(int b=0;b<word.length;b++) {
    				word[word.length-b-1][a] = word[b][a];
    			}
    		}
    		
    		//打印十字图形
    		for(int m=0;m<row;m++) {
    			for(int n=0;n<col;n++) {
    				System.out.print(word[m][n]);
    			}
    			System.out.println();
    		}
    	}
    }

大致的步骤就是将二维数组全部元素定义为‘.’,然后通过修改内部结构完成十字图的输出。
这个算法是我脑海里第一个想到的,肯定还会有更简单的算法,有想法的小伙伴欢迎在文章下面评论交流喔。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值