PTA 4 分形的递归输出

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

一个盒状分形定义如下: 度为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
-

结尾无空行

分析:

这道题的难点是把坐标的位置表示出来。采用分治算法的思想,把问题规模划成5个子问题。假设最上面的一个子规模的最左上角X坐标为(x,y),则左下方子规模的坐标最左上角的X坐标为(x+2*m, y)。中间子规模的最左上角的X的最左上角的X坐标为(x+m, y+m),以此类推,右上角坐标为(x, y+2*m),右下角的坐标为(x+2*m,y+2*m)。

而最大为7形分盒。直接把最大分盒先存起来,要哪个分盒直接打印即可。

代码如下:

#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#define MAX 745//7度n形分盒,最大规模为3^6=729.

char a[MAX][MAX];

void Print(int n, int x, int y)
{
	if (n == 1) a[x][y] = 'X';
	else
	{
		int m = (int)pow(3, n - 2);//将大模块分成小模块,每个小模块的规模位3^(n-2)
		Print(n - 1, x, y);//左上角
		Print(n - 1, x, y + 2 * m);//右上角 
		Print(n - 1, x + m, y + m);//中间 
		Print(n - 1, x + 2 * m, y);//左下角 
		Print(n - 1, x + 2 * m, y + 2 * m); //右下角 
	}
}
int main()
{
	for (int i = 0; i < pow(3, 6); i++)
	{
		for (int j = 0; j < pow(3, 6); j++)
		{
			a[i][j] = ' ';
		}
	}
	Print(7, 0, 0);//把最大规模初始化,下面直接调用打印即可。
	int num;
	scanf("%d", &num);
	while (num != -1)
	{
		int len = (int)pow(3, num - 1);//分型规模,因为数组长度为n,而下标为n-1
		for (int i = 0; i < len; i++)
		{
			for (int j = 0; j < len; j++)
			{
				printf("%c", a[i][j]);
			}
			printf("\n");
		}
		printf("-\n");
		scanf("%d", &num);
	}
    system("pause");
	return 0;
}

运行结果:

 

只截部分图 

  • 3
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值