蓝桥杯—打印十字图(JAVA实现)

一、题目

资源限制
时间限制:1.0s 内存限制:256.0MB

问题描述
小明为某机构设计了一个十字型的徽标(并非红十字会啊),如下所示:
在这里插入图片描述
对方同时也需要在电脑dos窗口中以字符的形式输出该标志,并能任意控制层数。

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

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

样例输入1
1

样例输出1
在这里插入图片描述
样例输入2
3

样例输出2
在这里插入图片描述
提示
请仔细观察样例,尤其要注意句点的数量和输出位置。

二、解题思路

通过观察可以发现输出的图形是有规律的,以样例2为例:

  1. 第一行和倒数第一行对称,第二行和倒数第二行对称,第三行和倒数第三行对称。。。
    第一列和倒数第一列对称,第二列和倒数第二列对称,第三列和倒数第三列对称。。。
  2. 图二为图一去掉第一、二行,倒数第一、二行,两边第一、二列(相当于去掉了两圈)
    在这里插入图片描述
    可以观察到,图二除四个顶点外,结构跟图一相同,如果再对图二去掉两圈,得到的图案结构会跟图二相同
  3. 由此,我们可以定义一个用‘.’填充的字符矩阵,递归的填两圈的‘$’,注意第一圈四个角是‘.’,最后将字符矩阵中心的最后一个点给填上
  4. 一开始直观的感受就是左上、左下、右上、右下是对称的,找规律填其中一个,那也就解决了整个矩阵,这是另一种思路了

三、代码实现

import java.util.Scanner;
public class Main {
	static char [][]arr;
	static int s;
	public static void main(String[] args) {
		Scanner scanner = new Scanner(System.in);
		while (scanner.hasNext()) {
			int n=scanner.nextInt();
			s=5+n*4;//观察可得,输出的均是5+n*4的矩阵
			arr=new char[s][s];
			for(int i=0;i<s;i++) {
				for(int j=0;j<s;j++) {
					arr[i][j]='.';//初始化矩阵
				}
			}
			tian(0,s,0);
			for(int i=0;i<s;i++) {
				for(int j=0;j<s;j++) {
					System.out.print(arr[i][j]);
				}
				System.out.println();
			}
		}
	}
	//count是每次递归开始的横坐标,len是每次递归瘦两圈前的最大长度,bu是步数
	private static void tian(int count,int len,int bu) {
		if(bu>s/4) {	//递归次数大于s/4就退出
			arr[s/2][s/2]='$';	//填补最中心的点
			return;
		}
		if(count!=0) {//不是第一圈就填上四个角
			arr[count][count]=arr[count][len-1]=arr[len-1][count]=arr[len-1][len-1]='$';
		}
		for(int i=count+2;i<len-2;i++) {
			//每次递归改变的第一行
			arr[count][i]=arr[i][count]=arr[len-1][i]=arr[i][len-1]='$';
			//每次递归改变的第二行
			if(i==count+2 || i==len-3) {
				arr[count+1][i]=arr[i][count+1]=arr[len-2][i]=arr[i][len-2]='$';
			}
		}
		//count+2,len-2起到瘦两圈的效果
		tian(count+2,len-2,bu+1);
	}
}
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值