分形,具有以非整数维形式充填空间的形态特征。通常被定义为“一个粗糙或零碎的几何形状,可以分成数个部分,且每一部分都(至少近似地)是整体缩小后的形状”,即具有自相似的性质。
一个盒状分形定义如下: 度为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;
}
运行结果:
只截部分图