分形【分治递归】

问题描述:

分形,具有以非整数维形式充填空间的形态特征。通常被定义为“一个粗糙或零碎的几何形状,可以分成数个部分,且每一部分都(至少近似地)是整体缩小后的形状”,即具有自相似的性质。

一个分形块可以定义为如下内容:

度数为1的分形块表示为:

X

度数为2的分形块表示为:

X X

 X

X X

如果用B(n-1)表示度数为n-1的分形块,那么度数为n的分形块可以递归地定义为如下形式:

B(n - 1)        B(n - 1)

        B(n - 1)

B(n - 1)        B(n - 1)

你的任务是绘制一个度数为n的分形块!

输入:

输入包括多个测试样例,每个测试样例是一个不超过7的正整数,以-1表示输入结束。

输出:

对于每一个测试样例,用大写字母‘X’表示分形盒子中的元素,按照度数要求输出分形块。每一个分形块输出结束后用破折号‘-’分隔。

输入样例:

1

2

3

4

-1

输出样例:

X

-

X X

 X

X X

-

X X   X X

 X     X

X X   X X

   X X

    X

   X X

X X   X X

 X     X

X X   X X

-

X X   X X        X X   X X

 X    X           X     X

X X   X X        X X   X X

   X X               X X

    X                 X

   X X               X X

X X   X X        X X   X X

 X    X           X     X

X X   X X        X X   X X

         X X   X X

          X    X

         X X  X X

            X X

             X

            X X

         X X  X X

          X    X

         X X  X X

X X   X X        X X   X X

 X    X           X     X

X X   X X        X X   X X

   X X               X X

    X                 X

   X X               X X

X X   X X        X X   X X

 X    X           X     X

X X   X X        X X   X X

-

import java.util.Arrays;
import java.util.Scanner;

public class Main {
    
	void cal(char[][] a,int n,int x,int y){
		if(n == 1){
			a[x][y]='X';
			return ;
		}	
		int m=(int) Math.pow(3, n-2);//为度为n-1形状的长度,也为同行间的空白长度
		cal(a,n-1,x,y);//赋值左上角
		cal(a,n-1,x,y+2*m);//赋值右上角
		cal(a,n-1,x+m,y+m);//赋值中间
		cal(a,n-1,x+2*m,y);//赋值左下角
		cal(a,n-1,x+2*m,y+2*m);//赋值右下角
	}
	
	void print(char[][] a){//打印,注意格式问题,每行后面不能有多余的空格
		
		for(int i=0;i<a.length;i++){
			for(int j=a[i].length-1;;j--){
				if(a[i][j] == 'X'){
					break;
				}
				a[i][j]='!';
			}
		}
		
		for(int i=0;i<a.length;i++){
			for(int j=0;j<a[i].length;j++){
				if(a[i][j] == '!'){
					break;
				}
				System.out.print(a[i][j]);
			}
			System.out.println();
		}
		
		System.out.println("-");
	}

	public static void main(String[] args) {
		Scanner in=new Scanner(System.in);
		Main main=new Main();
		int n=0;
		while((n=in.nextInt()) != -1){
			
			
			int size=(int) Math.pow(3, n-1);
			char[][] a=new char[size][size];
			
			for(int i=0;i<a.length;i++){//赋初值
				Arrays.fill(a[i], ' ');
			}
			
			main.cal(a,n,0,0);//递归赋值
			
			main.print(a);//打印
			
		}
	}
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

算法小生Đ

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值