递归4:【SSL】1562 分形——2021-03-03更

递归4:分形

题源:【SSL】1562

题目:

分形(fractal)是物体在数量上,内容上“自相似”的一种数学抽象。
一个盒分形(box fractal)定义如下:

1度的盒分形为

X

2度盒的分型为
X XXX X
如果B(n - 1)表示n – 1度的盒分形,则n度的盒分形递归定义如下
在这里插入图片描述
请画出n度的盒分形的图形。

输入
由若干测试用例组成,每行给出一个不大于7的正整数。输入的最后一行以一个负整数-1表示输入结束。

输出
对于每个测试用例,输出用’X’标记的盒分形。注意’X’是大写字母。在每个测试用例后输出包含一个单破折号的一行。

输入样例
1
2
3
4
-1

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

思路:

这道题如果能想到思路还是挺好做的。主要是我一开始想错了。

开一个二维字符数组,每输入一个数据就去找ta的中心点,然后往五个位置递归(上面有图),一直到递归的数据为1,然后把当前位置的数组里面设为 “X” ,然后在递归结束之后输出数组,再输出 “_” ,最后记得要把数组里面全设为 “ ” ,不然输出会炸。

代码:

#include<bits/stdc++.h>
using namespace std;
int n,k,h;
char a[800][800];

void b(int x,int y,int z)
{
    
    
	if(z==1)
	{
    
    
		a[x][y]='X';
		return ;
	}
	int d=pow(3,z-2);
	b(x-d,y-d,z-1);
	b(x-d,y+d,z-1);
	b(x+d,y-d,z-1);
	b(x+d,y+d,z-1);
	b(x,y,z-1); //往5个方向递归
} 
int main()
{
    
    
	while(1)
	{
    
    
		cin>>n;
		if(n==-1)
			break;
		int m=pow(3,n-1);	
		b(m/2+1,m/2+1,n);
		for(int i=1;i<=m;i++)
		{
    
    
			for(int j=1;j<=m;j++)
				cout<<a[i][j];
			puts("");	
		}
		for(int i=1;i<=m;i++)
			for(int j=1;j<=m;j++)
				a[i][j]=' '; //清空数组
		puts("-");
	}
	return 0;
}

猜你喜欢

转载自blog.csdn.net/SSL_wyd/article/details/114327311
今日推荐